0

次のように、単一のペア ハッシュの配列を用意します。

arguments = [{:name=>"ABCD"},{:title=>"Awesome"},{:number=>4}]

ループして、それぞれをキーと値として引き出す必要があります。今、私はこれをやっています:

def methodname(*arguments, &block)
  arguments.each do |arg|
    arg.each do |key, value|
      # use my key and value
    end
  end
  # use the &block here in awesome ways
end

イク。もっと良い方法が必要なので、誰か知っているかどうか尋ねます。私は検索しましたが、StackOverflow でこの特定の質問を見つけることができないようですが、そこにあるかどうか教えてください。

編集: コード例にコンテキストを追加しました。

4

3 に答える 3

2

引数が一意であると予想される場合...

arguments.inject({},:merge).each { ... }

FWIW - このデータ構造を変更できる場合は、変更することをお勧めします。このデータは、単一のハッシュでより適切に表現されます。

メソッドを別の方法で定義して、問題を完全に回避することもできます。

irb(main):011:0> def foo(kwargs={},&block)
irb(main):012:1>    pp kwargs
irb(main):013:1> end
irb(main):025:0> foo(:biz=>1,:baz=>2)
{:biz=>1, :baz=>2}
=> nil
于 2012-08-27T23:50:49.393 に答える
2

これは一般的な慣用句ではないため、本当にきれいな解決策を見つけることはできません。とにかく、ここにまともなショットがあります:

arguments.map(&:first).each do |key, value|
    # use key and value for something
end

Hashこのソリューションは、 がとして、反復で得られる最初の結果を返すメソッドをEnumerable持っているという事実を利用しています。それをすべてのハッシュにマッピングすると、準備完了です。first{:foo => :bar}.first == [:foo, :bar]

于 2012-08-27T23:56:34.187 に答える
1
arguments.each do |arg|
  (key, value), = *arg
  # use my key and value
end

これを「より良い方法」と考えるかどうかは、チームメイトが Ruby での代入の仕組みを理解しているかどうかにかかっていると思います。

于 2012-08-27T23:55:41.477 に答える