2013-04-06 59 views
0

快速问题,为什么这不起作用?Ruby语法添加方法糖

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

我得到了(希望1):

SyntaxError: unexpected tOP_ASGN, expecting $end 
(sum[e] ||= 0) += 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) 

集总和是一个散列结果,其中,当你访问它的每一个键被自动设置为0。

+0

很酷,我看,感谢编辑。我会问你,如果你知道一种方法来保持它的语法 - sugarely方式 – Hartator 2013-04-06 23:57:16

+0

@Hartator当然没问题,很高兴我能帮上忙。随时在有机会时将其标记为正确。 – 2013-04-07 01:36:05

+0

人们也可以让哈希具有未定义键的[初始化块](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