8

以下の ruby​​ の例に示すように、引数の数について厳密であるため、a から作成されたlambdaように間違った数の引数で a を呼び出すことはできません。ProcMethod

# method with no args
def a; end

instance_eval(&method(:a))
# ArgumentError: wrong number of arguments (1 for 0)

method(:a).to_proc.call(1, 2, 3)
# ArgumentError: wrong number of arguments (3 for 0)

method(:a).to_proc.lambda?
# => true

aまたはProca からラムダではない aを取得するにはどうすればよいですか?ProcMethod

4

3 に答える 3

2

これを行う方法はありません。

引数の受け渡し以外に、メソッド内の a に何を期待するのだろうかreturn。それは方法でのみ動作することができlambdaます...

本当にこれを行う必要がある場合は、独自のブロックを構築する必要があります。

Proc.new{ a }

より一般的な方法でarityは、メソッドの をチェックして、必要なパラメーターのみを渡す必要があります。

于 2013-04-25T13:31:58.633 に答える
0

次のように、非ラムダでラップしてみてくださいProc

l = lambda {|a,b| puts "a: #{a}, b: #{b}" }
p = proc {|a,b| l.call(a,b) }

l.lambda?
#=> true
l.arity
#=> 2
l.call("hai")
#=> ArgumentError: wrong number of arguments (1 for 2)
l.call("hai", "bai", "weee", "womp", "woo")
#=> ArgumentError: wrong number of arguments (5 for 2)

p.lambda?
#=> false
p.arity
#=> 2
p.call("hai")
#=> a: hai, b: 
p.call("hai", "bai", "weee", "womp", "woo")
#=> a: hai, b: bai
于 2015-09-25T05:40:02.883 に答える