2010-09-08 94 views
9

我可以从块创建红宝石哈希?使用块创建哈希(红宝石)

像这样的东西(虽然这是专门不工作):

foo = Hash.new do |f| 
    f[:apple] = "red" 
    f[:orange] = "orange" 
    f[:grape] = "purple" 
end 
+0

出于好奇,您是否尝试这种方法,因为您在创建新的ActiveRecord对象时会这样做? – 2010-09-08 23:17:56

回答

12

我不明白为什么

foo = { 
    :apple => "red", 
    :orange => "orange", 
    :grape => "purple" 
} 

不是为你工作?

我想张贴此作为评论,但我找不到按钮,对不起

+0

你提出一个好点:) – user94154 2010-09-08 17:08:19

+1

你需要50声望,然后才能发表评论。你应该可以留下评论,现在你的答案已经被提升。 – mikej 2010-09-08 17:08:56

+0

谢谢,我想我应该先阅读规则:D – gkaykck 2010-09-08 19:01:48

17

在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' }可能是你真正需要的。

+0

我有一个夹具文件,或多或少是一堆ActiveRecord创建方法调用。为了可读性而想要它。 – user94154 2010-09-08 17:30:14

3

这有什么错

foo = { 
    apple: 'red', 
    orange: 'orange', 
    grape: 'purple' 
} 
4

传递一个块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

0

正如其他人所说,简单的哈希语法可能会得到你想要的。

# 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? 
}