使用块创建哈希(Ruby)

use*_*154 9 ruby hash block

我可以从一个块创建一个Ruby哈希吗?

像这样的东西(虽然这特别不起作用):

foo = Hash.new do |f|
  f[:apple] = "red"
  f[:orange] = "orange"
  f[:grape] = "purple"
end
Run Code Online (Sandbox Code Playgroud)

wup*_*tah 18

在Ruby 1.9中(或者在加载ActiveSupport时,例如在Rails中),您可以使用Object#tap,例如:

foo = Hash.new.tap do |bar|
  bar[:baz] = 'qux'
end
Run Code Online (Sandbox Code Playgroud)

您可以传递一个块Hash.new,但这用于定义默认值:

foo = Hash.new { |hsh, key| hsh[key] = 'baz qux' }
foo[:bar]   #=> 'baz qux'
Run Code Online (Sandbox Code Playgroud)

对于它的价值,我假设你有一个更大的目的与这块事.语法{ :foo => 'bar', :baz => 'qux' }可能就是你真正需要的.


gka*_*kck 13

我不明白为什么

foo = {
  :apple => "red",
  :orange => "orange",
  :grape => "purple"
}
Run Code Online (Sandbox Code Playgroud)

不适合你吗?

我想发布此评论,但我找不到按钮,抱歉


And*_*imm 5

传递一个块来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"}
Run Code Online (Sandbox Code Playgroud)

由于查找不存在的键将覆盖:apple:orange和的任何现有数据:grape,因此您不希望发生这种情况。

这是Hash.new 规范的链接。