Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl “服务中的对象”下不可见的修饰符_Perl_Moo_Bread Board - Fatal编程技术网

Perl “服务中的对象”下不可见的修饰符

Perl “服务中的对象”下不可见的修饰符,perl,moo,bread-board,Perl,Moo,Bread Board,鉴于以下情况: Moo 2.001001 面包:纸板0.34 一个Bread::Board容器 基类Foo带有属性str和around修饰符,用于str 子类Bar扩展Foo 问题是: [好]当从普通条实例化对象时,执行Foo::str修饰符 [BAD]从容器服务为Bar实例化对象时,Foo::str修饰符未执行 [更糟]在[坏]发生后,从普通条实例化也不再有效 代码示例: #!/usr/qlc/apps/common/perl_5.18.2/bin/perl -w package F

鉴于以下情况:

  • Moo 2.001001
  • 面包:纸板0.34
  • 一个
    Bread::Board
    容器
  • 基类
    Foo
    带有属性
    str
    around
    修饰符,用于
    str
  • 子类
    Bar
    扩展
    Foo
问题是:

  • [好]当从普通
    实例化对象时,执行
    Foo::str
    修饰符
  • [BAD]从容器服务为
    Bar
    实例化对象时,
    Foo::str
    修饰符未执行
  • [更糟]在[坏]发生后,从普通
    实例化也不再有效
代码示例:

#!/usr/qlc/apps/common/perl_5.18.2/bin/perl -w

package Foo;

use Moo;

has str => ( is => 'rw', default => '' );

sub BUILD {
    my ($self, $args) = @_;

    $self->str($self->str);
}

around str => sub {
    my ($orig, $self, $val) = @_;

    return $self->$orig unless defined $val;

    $self->$orig('prefix_'.$val);
};
# end of Foo



package Bar;

use Moo;

extends 'Foo';
# end of Bar



package main;

use 5.010;
use strictures 2;

use Bread::Board;

my $c = container 'MyApp' => as {
    service 'foo' => ( class => 'Foo', parameters => { str => { optional => 1 } } );
    service 'bar' => ( class => 'Bar', parameters => { str => { optional => 1 } } );
};


my $foo_plain = Foo->new({ str => 'foo_plain' });
say "foo_plain = ".$foo_plain->str;

my $foo_bb = $c->resolve( service => 'foo', parameters => { str => 'foo_bb' } );
say "foo_bb = ".$foo_bb->str;

$foo_bb->str('foo_bb_setter');
say "foo_bb_setter = ".$foo_bb->str;

my $foo_plain_after_bb = Foo->new({ str => 'foo_plain_after_bb' });
say "foo_plain_after_bb = ".$foo_plain_after_bb->str;


my $bar_plain = Bar->new({ str => 'bar_plain' });
say "bar_plain = ".$bar_plain->str;

my $bar_bb = $c->resolve( service => 'bar', parameters => { str => 'bar_bb' } );
say "bar_bb = ".$bar_bb->str;

$bar_bb->str('bar_bb_setter');
say "bar_bb_setter = ".$bar_bb->str;

my $bar_plain_after_bb = Bar->new({ str => 'bar_plain_after_bb' });
say "bar_plain_after_bb = ".$bar_plain_after_bb->str;


die;
输出:

foo_plain = prefix_foo_plain
foo_bb = prefix_foo_bb
foo_bb_setter = prefix_foo_bb_setter
foo_plain_after_bb = prefix_foo_plain_after_bb
bar_plain = prefix_bar_plain
bar_bb = bar_bb
bar_bb_setter = bar_bb_setter
bar_plain_after_bb = bar_plain_after_bb
请注意,
bar\u bb
bar\u bb\u setter
bar\u plain\u后的
bar\u bb
输出不包含
前缀
字符串


为什么?

这是面包板上的一个虫子

固定在


谢谢。

问题正在调查中