2013-04-23 89 views
4

我正在通過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}應該工作,但事實並非如此。)

有人能解釋這是怎麼回事就在這裏,如果有其他方法,從數組中添加值成哈希?

回答

3

這是類方法和實例方法之間差異的一個例子嗎?

沒錯。

但是,爲什麼可以縮短爲Hash[*order]

Ruby將some_object[]解釋爲調用名爲[]的方法some_object。這對Hashes不是特別的,你可以在你自己的任何類中實現一個[]方法,並使用該語法。

有人可以解釋這裏發生了什麼,如果有替代方法可以將數組中的值添加到散列中嗎?

Hash[*order]調用創建新哈希的類方法(Hash#[])。 o.[](*order)由於相同的原因不起作用,您不能致電new{}.new沒有任何意義。您不能在類的實例上調用類方法。

您可以merge添加值:

o = Hash.new 
o.merge(Hash[*order]) 

o = {*order}不起作用,因爲{}是字面一個哈希的語法,並把*order在那裏沒有任何意義。

Hash(*order)Kernel#Hash,這是一種只需要一個參數的方法。

+0

謝謝,這有幫助。那麼爲什麼你不能'哈希(*訂單)'?我很困惑,在這裏如何使用方括號是有意義的。 – sgroves 2013-04-23 20:32:24

+2

@sgroves該語法調用'Kernel#Hash',鏈接到我更新的答案的最後一行。 – 2013-04-23 20:40:46

+3

'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

1

當你寫Hash(*order)你實際上調用Kernel模塊,這是不一樣的要求在Hash類的[]方法在Hash方法。請參閱docs瞭解Kernel#Hash以瞭解發生了什麼。

+2

'Hash(* order)'調用'Kernel#Hash'。 'Hash [* order]'實際上在問題中調用哈希上的公共類方法。 – 2013-04-23 20:38:24

+0

感謝您的發現。我已經更新了我的答案,因爲我打算先寫'Hash(* order)'。 – 2013-04-23 21:28:10

相關問題