0

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

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

我得到(期待1):

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

1 回答 1

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。

于 2013-04-06T23:48:33.360 回答