我正在通過RubyMonk學習Ruby。在解決waiter robot problem,有一行代碼,創建使用數組一個新的哈希:Ruby:使用一組鍵/值設置一個新的散列
o = Hash[*order]
給出
order = [:table, 1, :sandwich, "denver", :drink, "mango shake"]
我明白什麼正在這裏做,以及如何圖示操作者的作品。不過,我對創建這個散列的語法感到困惑。 RubyDoc說::[]
真的是被調用的方法,所以我能夠確定o = Hash::[](*order)
是同樣的事情。但爲什麼可以縮短爲Hash[*order]
?這是一個由解析器解析的特殊構造,還是有其他原因?沿着同樣的路線,爲什麼不做以下任何工作?
o = Hash.new
o.[](*order)
或
o = Hash.new
o[*order]
,甚至像o = {}[*order]
我知道這些不應該工作;我只是不知道爲什麼。我想我沒有先用Hash.new
實例化一個散列,而是使用Hash[*order]
而感到困惑。這是類方法和實例方法之間區別的例子嗎?
(作爲一個側面說明,在我看來那o = {*order}
應該工作,但事實並非如此。)
有人能解釋這是怎麼回事就在這裏,如果有其他方法,從數組中添加值成哈希?
謝謝,這有幫助。那麼爲什麼你不能'哈希(*訂單)'?我很困惑,在這裏如何使用方括號是有意義的。 – sgroves 2013-04-23 20:32:24
@sgroves該語法調用'Kernel#Hash',鏈接到我更新的答案的最後一行。 – 2013-04-23 20:40:46
'Hash []'是一種便利的類方法,當您調用'object []'時,它與Hash []'是不同的方法。檢出[Hash class docs](http://www.ruby-doc.org/core-1.9.3/Hash.html)並查找兩個不同的[]'方法。另外'[]'是語言中的一個特殊的分析案例,它基本上是'object。[](args)''。 – Azolo 2013-04-23 20:41:25