快速提问,为什么这不起作用?
sum = {}
e = "a"
(sum[e] ||= 0) += 1
我得到了(期待
1
):SyntaxError: unexpected tOP_ASGN, expecting $end
(sum[e] ||= 0) += 1
最佳答案
当您执行(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。
关于ruby - ruby 语法糖的加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857266/