2012-03-02 46 views
0

可能重複:
How does shovel (<<) operator work in Ruby Hashes?RubyKoans - 混淆哈希例如

我做我的方式通過RubyKoans,以及關於散列的例子之一是真的困惑了我。該示例位於about_hashes.rb文件中。這裏是困惑我的代碼:

hash = Hash.new([]) 

hash[:one] << "uno" 
hash[:two] << "dos" 

assert_equal __, hash[:one] 

對於那些不熟悉RubyKoans,你應該填寫爲雙下劃線正確的值。

在本例中,我看到變量使用Hash對象構造,它取代的nil用空Array默認值命名hash。然後,使用<< Ruby運算符將兩個項目添加到hash,每個項目都有一個數組元素。我期望hash[:one]會返回一個值爲["uno"]的數組,但Ruby告訴我它實際上是["uno", "dos"]。是什麼賦予了?

+1

如果你有兩個問題,你應該問兩個問題。這樣他們都可以被回答,他們都可以被Google搜索到,他們都可以被其他具有相同問題的人發現。目前,你關於':foobar'的問題被隱藏在一個帶有'Hash'標題的問題中,用'hash'標記。 – 2012-03-02 17:38:34

回答

0

Hash構造使用相同的數組作爲缺省值,所以直到使用[]=操作者上的散列鍵所有的散列值將實際被初始化爲默認相同數組的引用(例如,hash[:one] = some_new_object)。這就是爲什麼你在數組中看到兩個字符串的原因。

根據this answer to another question,您需要爲哈希構造函數使用塊形式。該塊會爲每一個新的哈希鍵來執行:

hash = Hash.new { |h,k| h[k] = [] } 

至於冒號爲前綴的令牌,這些都是所謂的符號文字。符號很像字符串,但有一些重要的區別。一個是相同的符號值將始終引用內存中的同一個對象(這不一定是字符串)。符號具有其他特性,使其性能比常量字符串稍好。其他符號非常像字符串文字。

+0

有沒有辦法在不使用塊語法的情況下實現相同的結果?這種Ruby行爲真的很奇怪。 – 2012-03-02 17:44:37