Ruby语法糖加法方法

时间:2013-04-06 23:45:23

标签: ruby syntax syntax-error addition

快速提问,为什么这不起作用?

sum = {}
e = "a"
(sum[e] ||= 0) += 1

我得到了(期待1):

SyntaxError: unexpected tOP_ASGN, expecting $end
(sum[e] ||= 0) += 1

1 个答案:

答案 0 :(得分:2)

当你(sum[e] ||= 0)时,括号会导致表达式被评估。因此,它将评估sum[e](例如0)的值,您无法对其进行+=操作。它不会像您期望的那样返回sum[e]的左值/引用。

您可以通过对结果执行相同的操作来验证这一点:

irb(main):001:0> 0 += 1
SyntaxError: (irb):1: syntax error, unexpected tOP_ASGN, expecting $end

甚至是这样的事情:

irb(main):004:0> (sum[e]) += 1
SyntaxError: (irb):4: syntax error, unexpected tOP_ASGN, expecting $end

如果由于某种原因你希望将它保持在一行,你可以这样做:

sum[e] ||= 0; sum[e] += 1

正如dbenhur所提到的,如果你要做很多事情,你也可以为哈希中的所有键设置默认值:

sum = Hash.new(0)

将sum设置为哈希值,当您访问它时,每个键都会自动设置为0。