我可以从块创建红宝石哈希?使用块创建哈希(红宝石)
像这样的东西(虽然这是专门不工作):
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