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

Posted

技术标签:

【中文标题】使用 Perl/Moose,修饰符返回的值会发生啥变化?【英文标题】:Using Perl/Moose, what happens to the value returned by modifiers?使用 Perl/Moose,修饰符返回的值会发生什么变化? 【发布时间】:2011-09-13 21:08:36 【问题描述】:

学习 perl 我最近才发现 Moose 的神奇之处!

我正试图围绕修饰符来思考——或者至少是如何处理返回值......它们是否存储在某个地方?

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__ 

【问题讨论】:

化妆品说明:package 块周围不需要大括号。 package 表示“之后的所有内容都将包含在这样的包中”。由于您通常会坚持每个文件使用一个包,因此不会有歧义。请注意,从 5.14 开始,您还可以使用更符合其他命名空间大括号语言的 package Util::Printable contents 语法。新语法是否会取代当前的常见做法还有待观察。 【参考方案1】:

假设一个方法有一个before 和一个after 包装器。

    before 代码被调用。 其返回值被忽略/丢弃。 调用原始方法。 它的价值被保存了。 after 代码被调用。 其返回值被忽略/丢弃。 保存的值被返回。

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

【讨论】:

以上是关于使用 Perl/Moose,修饰符返回的值会发生啥变化?的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数分配给 long double 时,它​​的值会发生啥变化?

如果在 java 中没有指定修饰符会发生啥? [复制]

C++中,啥时候 必须 用类名加作用域符调用函数? 有static修饰的成员函数被 对象调用会发生啥?

返回值会发生啥?

对于C语言啥时候应该使用volatile修饰符

v-model修饰符