perl – 什么时候应该使用子例程属性?
我根本不填写Perl子程序属性。
我从来没有见过他们在实际的代码和 什么是有用的属性? 如果有人可以把他们应该使用的属性的一个详细的例子放在一起,那将是很好的。 对于那些像我一样无知的人,属性是属性中的冒号之后的参数概要示例如下: sub foo : method ; my ($x,@y,%z) : Bent = 1; my $s = sub : method { ... }; use attributes (); # optional,to get subroutine declarations my @attrlist = attributes::get(&;foo); use attributes 'get'; # import the attributes::get subroutine my @attrlist = get &;foo; 解决方法
属性允许您注释变量以在幕后执行自动魔术。类似的概念是
java annotations.这是一个可能有帮助的小例子。它使用Attribute :: Handlers创建响亮的属性。
use Attribute::Handlers; sub UNIVERSAL::loud : ATTR(CODE) { my ( $pkg,$sym,$code ) = @_; no warnings 'redefine'; *{$sym} = sub { return uc $code->(@_); }; } sub foo : loud { return "this is $_[0]"; } say foo("a spoon"); say foo("a fork"); 每当一个sub被声明为大声的属性时,UNIVERSAL :: loud回调触发在sub上显示元信息。我重新定义了这个函数,实际上调用一个匿名子类,这个子进程调用原来的子代并将其传递给uc 输出: THIS IS A SPOON THIS IS A FORK 现在我们来看一下SYNOPSIS中的变量示例: my ($x,%z) : Bent = 1; 将它分解成小的perl语句,而不考虑我们拥有的属性 my $x : Bent $x = 1; my @y : Bent @y = 1; my %Z : Bent %z = 1; 我们现在可以看到,每个变量都以简洁的方式归因于Bent注释,同时也为所有变量赋值1.这可能是一个更有趣的例子: use Attribute::Handlers; use Tie::Toggle; sub UNIVERSAL::Toggle : ATTR(SCALAR) { my ($package,$symbol,$referent,$attr,$data,$phase) = @_; my @data = ref $data eq 'ARRAY' ? @$data : $data; tie $$referent,'Tie::Toggle',@data; } my $x : Toggle; say "x is ",$x; say "x is ",$x; 哪些输出: x is x is 1 x is 您可以使用它来进行日志记录,创建测试注释,向变量添加类型细节,语法糖,做moose-ish角色组合以及许多其他很酷的东西。 还看到这个问题:How do Perl method attributes work?。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |