簡體   English   中英

使用塊創建哈希(Ruby)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM