ブロックからRubyハッシュを作成できますか?
このようなもの(これは特に機能していませんが):
foo = Hash.new do |f|
f[:apple] = "red"
f[:orange] = "orange"
f[:grape] = "purple"
end
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' }本当に必要なのは構文だけかもしれません。
理由がわからない
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 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?
}