キーワード引数
id:kusigahama:20051021#p1につけたコメントへの追記。
名前さえわかれば、その順番にHashの値をArray化して、*で引数に展開することはできますよね。
というのは多分以下のようなものを想定しているのだと想像しました。
def calc(foo, bar, baz) foo + bar * baz end m = method(:calc) m.call(1, 2, 3) # => 7 h = {:foo => 1, :bar => 2, :baz => 3} # もちろんeach_argument_nameは架空のメソッドで、 # 引数名を順番にSymbolで渡す、とか言ったりして。 a = [] m.each_argument_name do |name| a.push(h[name]) end m.call(*a) # => 7
calcの仕様を変えられないのであれば上記のやりかたもアリですが、each_argument_nameという(名前の是非はともかく)夢の仕様が無ければ実現は難しそうです。
で、引数をHashで受け取るようにすれば解決しそうな気がしたので先のコメントを書いたわけですが、こんどはcalc内部での記述が面倒ですね。もともとHashを受け取るつもりで書いたわけではなく、あくまでもキーワード引数の代わりに使おうとして書いたとすると、args[:foo]というのはくどい表現かも。
def calc(args) args[:foo] + args[:bar] * args[:baz] end h = {:foo => 1, :bar => 2, :baz => 3} calc(h) # => 7
将来(Ruby 2.0)的にはメソッドの引数にHashを展開すると自動的にキーワード引数として扱ってもらえると楽そうです。Arrayの展開と、キーワード引数の残りをHashで受け取れるらしいという情報から、こういう仕様もアリだと思います。
def calc(foo:, bar:, baz:) foo + bar * baz end h = {:foo => 1, :bar => 2, :baz => 3} calc(**h) # => 7
Hashを展開してキーワード引数とする話題はruby-dev:23533でも出てますね。