使用 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 时,它的值会发生啥变化?