使用Perl/Moose,修饰符返回的值会发生什么变化?

使用Perl/Moose,修饰符返回的值会发生什么变化?,perl,return-value,moose,modifier,Perl,Return Value,Moose,Modifier,学习perl我最近发现了驼鹿的神奇之处 我试着用修饰符——或者至少是返回值是如何处理的。。。它们被存放在什么地方了吗 {package Util::Printable; use Moose::Role; requires 'to_str','init'; before 'to_str' => sub { my($self) = @_; $self->{to_string} = "my string thing"; return $se

学习perl我最近发现了驼鹿的神奇之处

我试着用修饰符——或者至少是返回值是如何处理的。。。它们被存放在什么地方了吗

{package Util::Printable;

use Moose::Role;

  requires 'to_str','init';

  before 'to_str' => sub {
      my($self) = @_;
      $self->{to_string} = "my string thing";
      return $self->{to_string}; 
  };

  after 'init' => sub{
    my($self) = @_;
    $self->{roles} = __PACKAGE__;
    $self->{is_printable} = 1;
  };


}
1;
__END__ 
使用可打印角色

{package MonkeyPrint;
use Moose;

with 'Util::Printable';


  sub init{
    my($self) = @_;
    return 1;
  };

  sub BUILD{
    my($self) = @_;
    $self->init();  
  }


  # ------------------------------------------------------------------------ # 
  # Printable Support
  # ------------------------------------------------------------------------ #
  use overload '""' => 'to_str';  

  sub to_str {
      my($self) = @_;
      $self->{to_string} = __PACKAGE__;
      return $self->{to_string}; 
  };


 __PACKAGE__->meta->make_immutable;
}
1;
__END__ 

假设一个方法在之前有一个
,在
之后有一个

  • 调用
  • 代码之前的
    
    
  • 其返回值被忽略/丢弃
  • 调用原始方法
  • 它的价值被保存
  • 调用
  • 代码之后的
    
    
  • 其返回值被忽略/丢弃
  • 将返回保存的值

  • 如果需要更改或替换原始方法返回的值,请使用
    around

    示意性说明:您的
    块周围不需要大括号
    package
    意味着“之后的一切都将在这样的包中。”因为通常每个文件只使用一个包,所以不会出现二元性。注意,从5.14开始,您还可以使用
    package Util::Printable{contents}
    语法,该语法更符合其他名称空间的花括号语言。新的语法是否会取代目前的惯例尚待观察。