让我们暂时忽略Damian Conway的最佳实践,即任何给定子例程的位置参数不超过三个。
下面的两个例子在性能或功能上有什么不同吗?
使用shift
sub do_something_fantastical {
my $foo = shift;
my $bar = shift;
my $baz = shift;
my $qux = shift;
my $quux = shift;
my $corge = shift;
}
使用@_
sub do_something_fantastical {
my ($foo, $bar, $baz, $qux, $quux, $corge) = @_;
}
假设这两个示例在性能和功能方面是相同的,那么人们如何看待一种格式优于另一种格式?显然,使用@_
的示例代码行数更少,但是使用shift
不是更容易理解吗?欢迎有充分理由的意见。
发布于 2009-01-06 06:54:26
这是一个功能上的区别。shift会修改@_
,而来自@_
的赋值不会。如果之后不需要使用@_
,那么这种差异对您来说可能无关紧要。我总是尝试使用列表赋值,但有时也会使用shift
。
但是,如果我从shift
开始,如下所示:
my( $param ) = shift;
我经常创建这个bug:
my( $param, $other_param ) = shift;
这是因为我不经常使用shift
,所以我忘了跳到赋值的右侧,将其更改为@_
。这就是不使用shift
的最佳实践的要点。我可以像您在示例中所做的那样,为每个shift
创建单独的行,但这太乏味了。
发布于 2009-01-06 03:50:30
我认为shift示例比使用@_慢,因为它有6个函数调用,而不是1个。它是否值得注意甚至是可测量是另一个问题。在10k次迭代的循环中抛出每一个,并对它们进行计时。
至于美学,我更喜欢@_方法。使用shift方法进行意外的剪切和粘贴,似乎很容易打乱变量的顺序。另外,我也看到很多人这样做:
sub do_something {
my $foo = shift;
$foo .= ".1";
my $baz = shift;
$baz .= ".bak";
my $bar = shift;
$bar .= ".a";
}
这是非常糟糕的,很容易导致错误,例如,如果你剪切baz块并将其粘贴到bar块下。我完全赞成在使用位置附近定义变量,但我认为在函数顶部定义传入的变量更重要。
发布于 2009-01-06 03:57:01
我通常使用第一个版本。这是因为我通常需要将错误检查与移位一起进行,这更容易编写。说,
sub do_something_fantastical {
my $foo = shift || die("must have foo");
my $bar = shift || 0; # $bar is optional
# ...
}
https://stackoverflow.com/questions/415297
复制相似问题