我可以從塊創建紅寶石哈希?使用塊創建哈希(紅寶石)
像這樣的東西(雖然這是專門不工作):
foo = Hash.new do |f|
f[:apple] = "red"
f[:orange] = "orange"
f[:grape] = "purple"
end
我可以從塊創建紅寶石哈希?使用塊創建哈希(紅寶石)
像這樣的東西(雖然這是專門不工作):
foo = Hash.new do |f|
f[:apple] = "red"
f[:orange] = "orange"
f[:grape] = "purple"
end
在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' }
可能是你真正需要的。
我有一個夾具文件,或多或少是一堆ActiveRecord創建方法調用。爲了可讀性而想要它。 – user94154 2010-09-08 17:30:14
這有什麼錯
foo = {
apple: 'red',
orange: 'orange',
grape: 'purple'
}
傳遞一個塊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。
正如其他人所說,簡單的哈希語法可能會得到你想要的。
# 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?
}
出於好奇,您是否嘗試這種方法,因爲您在創建新的ActiveRecord對象時會這樣做? – 2010-09-08 23:17:56