2013-04-06 104 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