0
快速问题,为什么这不起作用?Ruby语法添加方法糖
sum = {}
e = "a"
(sum[e] ||= 0) += 1
我得到了(希望1
):
SyntaxError: unexpected tOP_ASGN, expecting $end
(sum[e] ||= 0) += 1
快速问题,为什么这不起作用?Ruby语法添加方法糖
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)
集总和是一个散列结果,其中,当你访问它的每一个键被自动设置为0。
很酷,我看,感谢编辑。我会问你,如果你知道一种方法来保持它的语法 - sugarely方式 – Hartator 2013-04-06 23:57:16
@Hartator当然没问题,很高兴我能帮上忙。随时在有机会时将其标记为正确。 – 2013-04-07 01:36:05
人们也可以让哈希具有未定义键的[初始化块](http://www.ruby-doc.org/core-2.0/Hash.html#method-c-new):'sum = Hash.new {| H,K | k [k] = 0}' – dbenhur 2013-04-07 03:31:48