是’shift’邪恶处理Perl子程序参数?
发布时间:2020-12-15 21:22:16 所属栏目:大数据 来源:网络整理
导读:我经常使用shift来解压缩功能参数: sub my_sub { my $self = shift; my $params = shift; ....} 不过,很多同事都在传讲这一转变其实是邪恶的。你能解释为什么我更喜欢 sub my_sub { my ($self,$params) = @_; ....} 转移? 解决方法 使用shift来解压缩参数
我经常使用shift来解压缩功能参数:
sub my_sub { my $self = shift; my $params = shift; .... } 不过,很多同事都在传讲这一转变其实是邪恶的。你能解释为什么我更喜欢 sub my_sub { my ($self,$params) = @_; .... } 转移? 解决方法
使用shift来解压缩参数不是邪恶的。这是一个常见的惯例,可能是处理参数的最快方法(取决于有多少参数以及如何传递参数)。这里有一个常见的场景,在这种情况下:一个简单的访问器。
use Benchmark qw(cmpthese); sub Foo::x_shift { shift->{'a'} } sub Foo::x_ref { $_[0]->{'a'} } sub Foo::x_copy { my $s = $_[0]; $s->{'a'} } our $o = bless {a => 123},'Foo'; cmpthese(-2,{ x_shift => sub { $o->x_shift },x_ref => sub { $o->x_ref },x_copy => sub { $o->x_copy },}); 在我的机器上的perl 5.8.8的结果: Rate x_copy x_ref x_shift x_copy 772761/s -- -12% -19% x_ref 877709/s 14% -- -8% x_shift 949792/s 23% 8% -- 不是戏剧性的,但它是。总是在你的目标硬件上的perl版本上测试你的场景,以确定。 如果您想要移除invocant,然后调用SUPER ::方法,传递剩余的@_就是这样,shift也是有用的。 sub my_method { my $self = shift; ... return $self->SUPER::my_method(@_); } 如果我有一个很长的系列我的$ foo = shift;在函数顶部的操作,但是,我可能会考虑使用@_的大量副本。但是一般来说,如果你有一个函数或方法需要多个参数,那么使用命名参数(即捕获%args哈希中的所有@_或者期望一个哈希引用参数)是一个更好的方法。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |