转:
shift || 35 就是【先 shift,如果 shift 不出看起来为“真”的东西,那么就取 35。】
语法上和 $foo || 35 没什么分别。都是利用了 || 这个运算符可以短路求值并返回为真的那个操作数这一特点。
但是 shift 又是什么意思呢?
shift 其实是 shift @ARGV 或者 shift @_ 的缩写。
就是一个很常见的数组操作,和 shift @foo 是一个语法。
至于到底是哪个的缩写,主要看 shift 出现在什么地方。
如果出现在 sub 里面,就是 shift @_,否则就是 @ARGV。
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。
比如下面这一句:
sub fee{
my $money = shift || 10;
........
比如这个 10 块钱好比是一个缺省的费用,
如果调用 fee 时没有提供这个参数,那么就认为是 10 块钱。
也许通常都是 10 块钱,这样编码时可以少输入不少 10,
但是如果上层业务逻辑决定要对某个客户实行一个特别的收费标准,那么可以在调用时传递参数:
fee(5);
这样就可以把收费标准降低成 5 块钱了(VIP?)
这时候,问题出现了:如果我们想要给客户免费服务呢?
假设 fee 的实现者和调用者是两个 team 的人,
那么也许书写上层业务逻辑的那位程序员可能会想当然地写:
fee(0);
错误已经发生了!
因为这样会对这位客户计费 10 块钱。
虽然我们有许多办法可以解决这个问题,
比如书写 fee 的文档、加强沟通、或者更为谨慎的:
my $fee = shift;
$fee = 10 if not defined $fee;
不过 Perl6 提供了一个更为方便的办法:
用来表达这一逻辑。
这个特性在 Perl 5.10 中就已经被引入了,也将成为 Perl5 后续版本中的一个功能。
[
本帖最后由 flw 于 2008-10-28 12:24 编辑 ]
阅读(2557) | 评论(0) | 转发(0) |