2010-09-08 129 views
9

我可以從塊創建紅寶石哈希?使用塊創建哈希(紅寶石)

像這樣的東西(雖然這是專門不工作):

foo = Hash.new do |f| 
    f[:apple] = "red" 
    f[:orange] = "orange" 
    f[:grape] = "purple" 
end 
+0

出於好奇,您是否嘗試這種方法,因爲您在創建新的ActiveRecord對象時會這樣做? – 2010-09-08 23:17:56

回答

12

我不明白爲什麼

foo = { 
    :apple => "red", 
    :orange => "orange", 
    :grape => "purple" 
} 

不是爲你工作?

我想張貼此作爲評論,但我找不到按鈕,對不起

+0

你提出一個好點:) – user94154 2010-09-08 17:08:19

+1

你需要50聲望,然後才能發表評論。你應該可以留下評論,現在你的答案已經被提升。 – mikej 2010-09-08 17:08:56

+0

謝謝,我想我應該先閱讀規則:D – gkaykck 2010-09-08 19:01:48

17

在Ruby 1.9(或加載的ActiveSupport,例如,在Rails的),你可以使用Object#tap,如:

foo = Hash.new.tap do |bar| 
    bar[:baz] = 'qux' 
end 

你可以傳遞一個塊Hash.new,而是用來定義默認值:

foo = Hash.new { |hsh, key| hsh[key] = 'baz qux' } 
foo[:bar] #=> 'baz qux' 

對於它的價值,我假設你有一個更大的目的在於這個塊的東西。語法{ :foo => 'bar', :baz => 'qux' }可能是你真正需要的。

+0

我有一個夾具文件,或多或少是一堆ActiveRecord創建方法調用。爲了可讀性而想要它。 – user94154 2010-09-08 17:30:14

3

這有什麼錯

foo = { 
    apple: 'red', 
    orange: 'orange', 
    grape: 'purple' 
} 
4

傳遞一個塊Hash.new指定當你問一個不存在的鍵會發生什麼。

foo = Hash.new do |f| 
    f[:apple] = "red" 
    f[:orange] = "orange" 
    f[:grape] = "purple" 
end 
foo.inspect # => {} 
foo[:nosuchvalue] # => "purple" 
foo # => {:apple=>"red", :orange=>"orange", :grape=>"purple"} 

至於找了一個不存在的密鑰不會在寫的:apple:orange:grape任何現有的數據,你不希望這種事情發生。

以下是鏈接到Hash.new specification

0

正如其他人所說,簡單的哈希語法可能會得到你想要的。

# Standard hash 
foo = { 
    :apple => "red", 
    :orange => "orange", 
    :grape => "purple" 
} 

但是,如果您使用「tap」或Hash與塊方法,您將獲得一些額外的靈活性,如果您需要的話。由於某些條件,如果我們不想將項目添加到Apple位置,該怎麼辦?我們現在可以執行如下操作:

# Tap or Block way... 
foo = {}.tap do |hsh| 
    hsh[:apple] = "red" if have_a_red_apple? 
    hsh[:orange] = "orange" if have_an_orange? 
    hsh[:grape] = "purple" if we_want_to_make_wine? 
}