2013-07-06 179 views
1

試圖瞭解爲什麼它返回一個很好的填充哈希:哈希[string.split(...)]對哈希[* string.split(...)]

Hash[*myString.split("\n")] 

雖然這將返回一個空哈希?

Hash[myString.split("\n")] 

我看到,星號是關鍵,這標誌着可變長度的參數...但哈希的要求之一[...]是,它可以採取偶數陣列並把它變成一個有效的散列。那麼,在上面的第二個例子中,新行上的string.split返回一個偶數數組,爲什麼Ruby不允許它?

回答

3

這是因爲splat *字符將數組擴展爲每個單獨的元素,而不是將數組作爲整體傳入。從紅寶石2.0哈希文檔:

Hash["a", 100, "b", 200]    #=> {"a"=>100, "b"=>200} 
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} 
Hash["a" => 100, "b" => 200]   #=> {"a"=>100, "b"=>200} 

傳遞使用Hash[]方法的元素簡單地格式化你所期望的哈希值。相比之下,與

Hash[ Array.new ] 

它返回一個空的哈希,因爲你基本上給它一個奇數的參數,這將不會映射到正確的哈希值。

+0

優秀的答案。當你說splat字符將數組擴展到每個單獨的元素時,它會爲我點擊。傳遞一個數組不會被視爲傳遞多個參數,因爲它只是一個對象。謝謝! (一旦網站允許我將標記爲答案)。 – mariocatch

+0

很高興能幫到你!其實我從來沒有想過用這種方法實例化哈希,所以查看文檔教會了我一兩件事! –

1

完全與現有的答案達成一致,但在這裏可以解釋,爲什麼需要在這種情況下,圖示一個更明顯的例子:

test_string = "my\ntest\nstring" 

[test_string.split("\n")] #=> [["my", "test", "string"]] 
[*test_string.split("\n")] #=> ["my", "test", "string"] 

因此,大家可以看到,不用你給Hash[]一個提示圖標單個參數(一個數組),而不是多個參數。

+0

太棒了,謝謝Matt! – mariocatch