[英]Create hash using block (Ruby)
我可以從一個塊創建一個Ruby哈希嗎?
像這樣的東西(雖然這特別不起作用):
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' }
可能就是你真正需要的。
我不明白為什么
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規范的鏈接。
怎么了?
foo = {
apple: 'red',
orange: 'orange',
grape: 'purple'
}
正如其他人所提到的,簡單的哈希語法可以為您提供所需的內容。
# Standard hash
foo = {
:apple => "red",
:orange => "orange",
:grape => "purple"
}
但是如果您使用“tap”或Hash with block方法,則可以根據需要獲得額外的靈活性。 如果由於某些條件我們不想將項目添加到蘋果位置怎么辦? 我們現在可以執行以下操作:
# 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?
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.