Chinaunix首页 | 论坛 | 博客

  • 博客访问: 898720
  • 博文数量: 226
  • 博客积分: 10077
  • 博客等级: 上将
  • 技术积分: 2708
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 14:36
文章分类

全部博文(226)

文章存档

2010年(15)

2009年(82)

2008年(129)

我的朋友

分类:

2008-11-04 11:33:04

转:

shift || 35 就是【先 shift,如果 shift 不出看起来为“真”的东西,那么就取 35。】
语法上和 $foo || 35 没什么分别。都是利用了 || 这个运算符可以短路求值并返回为真的那个操作数这一特点。

但是 shift 又是什么意思呢?
shift 其实是 shift @ARGV 或者 shift @_ 的缩写。
就是一个很常见的数组操作,和 shift @foo 是一个语法。
至于到底是哪个的缩写,主要看 shift 出现在什么地方。
如果出现在 sub 里面,就是 shift @_,否则就是 @ARGV。




其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

CODE:
sub fee{
    my $money = shift || 10;
    ........

比如这个 10 块钱好比是一个缺省的费用,
如果调用 fee 时没有提供这个参数,那么就认为是 10 块钱。
也许通常都是 10 块钱,这样编码时可以少输入不少 10,
但是如果上层业务逻辑决定要对某个客户实行一个特别的收费标准,那么可以在调用时传递参数:
fee(5);
这样就可以把收费标准降低成 5 块钱了(VIP?)

这时候,问题出现了:如果我们想要给客户免费服务呢?
假设 fee 的实现者和调用者是两个 team 的人,
那么也许书写上层业务逻辑的那位程序员可能会想当然地写:
fee(0);
错误已经发生了!
因为这样会对这位客户计费 10 块钱。

虽然我们有许多办法可以解决这个问题,
比如书写 fee 的文档、加强沟通、或者更为谨慎的:

CODE:
my $fee = shift;
$fee = 10 if not defined $fee;

不过 Perl6 提供了一个更为方便的办法:

CODE:
my $fee = shift // 10;

用来表达这一逻辑。
这个特性在 Perl 5.10 中就已经被引入了,也将成为 Perl5 后续版本中的一个功能。

[ 本帖最后由 flw 于 2008-10-28 12:24 编辑 ]
阅读(2500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~