我会在参数列表周围不使用括号来调用我的潜艇。例如,我想使用
mypush \@list, $item;
而不是
mypush(\@list, $item);
为了实现这一点,我已经用原型声明了我的潜艇。
sub mypush (+@) { push shift, @_ }
事实上,这也允许我接下来,但这只是一个奖励:
mypush @list, $item;
除了必须在代码中的任何地方之前使用原型声明子例程之外,在Perl中使用原型是否有任何严重的缺点?
代码看起来对我来说非常清晰。但一般情况下原型出错的地方?我什么时候后悔呢?
答案 0 :(得分:5)
最大的缺点之一是它使代码难以维护。很少有人能够理解Perl原型实际上做了什么,所以周围有很多猜测和货物结果。
请注意,Perl 5.20添加了subroutine signature feature。它仍然是实验性的,但它真的很棒,大多数人都希望原型能做到。并且,当我们添加类型约束时(哦圣诞老人,请请带给我圣诞节的那些我保证我会好!),我们将拥有我认为大多数人尝试用原型做的事情(与我编写的一些语法:
sub foo (Int $foo, String $var, Int @array) { ... }
答案 1 :(得分:1)
你的问题没有实际意义,因为原型对parens的需求没有影响。只要sub在它被使用之前被声明,parens是可选的。
$ perl -E'
sub foo { say @_; }
foo "bar";
'
bar
$ perl -E'
sub foo;
foo "bar";
sub foo { say @_; }
'
bar
请注意,省略parens存在严重缺点。
很容易意外地将错误的参数传递给子:
$ perl -E'
sub foo { say @_; }
foo 9*6;
foo (4+5)*6;
'
54
9
代码中的错误可能会导致误导和混淆错误消息。
$ perl -E'foo bar "baz";'
Can't locate object method "foo" via package "bar"
(perhaps you forgot to load "bar"?) at -e line 1.
Here当你省略parens时,另一个为你存储的古怪的例子。
问题可能比使用原型产生的问题更糟糕。使用这些"功能之一"看起来并不明智;引入这两组问题的可能性更小。