5

ラムダをに渡すにはどうすればよいhash.eachので、コードを再利用できますか?

> h = { a: 'b' }
> h.each do |key, value| end
 => {:a=>"b"}
> test = lambda do |key, value| puts "#{key} = #{value}" end 
> test.call('a','b')
a = b
> h.each &test
ArgumentError: wrong number of arguments (1 for 2)
  from (irb):1:in `block in irb_binding'
  from (irb):5:in `each'
  from (irb):5
  from /Users/jstillwell/.rvm/rubies/ruby-1.9.3-p362/bin/irb:16:in `<main>'
> h.each test
ArgumentError: wrong number of arguments(1 for 0)
  from (irb):8:in `each'
  from (irb):8
  from /Users/jstillwell/.rvm/rubies/ruby-1.9.3-p362/bin/irb:16:in `<main>'
4

3 に答える 3

12

each現在の要素をブロックに譲ります。したがって、ラムダは 2 つではなく 1 つの引数を取る必要があります。の場合、Hash生成される要素は 2 つの要素Arrayであり、最初の要素がキーで、2 番目の要素が値です。

test = lambda do |el| puts "#{el.first} = #{el.last}" end
h.each &test
# a = b

別の方法として、Ruby のサポートを使用してパラメーター リストのバインドを分解することもできます。

test = lambda do |(k, v)| puts "#{k} = #{v}" end
h.each &test
# a = b

lambdaまたは、メソッドと同じ引数バインディング セマンティクスを持つを使用する代わりにProc、ブロックと同じ引数バインディング セマンティクスを持つ を使用できます。つまり、単一のArray引数を複数のパラメータ バインディングにアンパックします。

test = proc do |k, v| puts "#{k} = #{v}" end
h.each &test
# a = b
于 2013-02-21T00:32:05.840 に答える
1

私はまだこれが一貫性のない構文だと感じています .Hash.eachとラムダの間のアリティの矛盾.

に切り替えました

lambda do |(key, value)|

その後、私は渡すことができます

hash.each &test

または私はそれを直接呼び出すことができます

test.call([key, value])

誰かがより良い答えを持っているか、少なくともこれが必要な理由を簡潔に言い訳できれば。喜んでポイントを差し上げます。

于 2013-02-21T00:29:55.537 に答える