9

ブロックからRubyハッシュを作成できますか?

このようなもの(これは特に機能していませんが):

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

5 に答える 5

18

Ruby 1.9(またはRailsなどのActiveSupportがロードされている場合)では、次のように使用できます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' }本当に必要なのは構文だけかもしれません。

于 2010-09-08T17:05:48.033 に答える
13

理由がわからない

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

あなたのために働いていませんか?

コメントとして投稿したかったのですが、ボタンが見つかりませんでした。ごめんなさい。

于 2010-09-08T16:58:23.763 に答える
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仕様へのリンクは次のとおりです。

于 2010-09-08T23:25:16.540 に答える
3

どうしたの

foo = {
  apple:  'red',
  orange: 'orange',
  grape:  'purple'
}
于 2010-09-08T17:54:11.223 に答える
1

他の人が述べているように、単純なハッシュ構文はあなたが望むものを得るかもしれません。

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

ただし、ブロック方式で「タップ」またはハッシュを使用すると、必要に応じて柔軟性が向上します。何らかの条件でアップルの場所にアイテムを追加したくない場合はどうなりますか?これで、次のようなことができます。

# 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?
}
于 2014-02-10T20:37:13.640 に答える