1

Proc.newブロックを引数として呼び出して渡すオブジェクトを作成しました。

a = Proc.new{|x| x = x*10; puts(x)}
#=> #<Proc:0xd26fd8@(irb):3>
a.call(10)
#100
#=> nil
a.call(10,20)
#100
#=> nil
a.call(10,20,40)
#100
#=> nil

私も使いませんでしたsplat operator(*)xしかし、ブロック パラメーターが余分な引数を無視できるようにするにはどうすればよいでしょうか。

同じことをすると明確なエラーが発生しますが、なぜブロック パラメーターの場合はそうではないのでしょうか?

def show(x)
print "X::#{x}"
end
#=> nil
show(10)
#X::10#=> nil
show(10,20)
#ArgumentError: wrong number of arguments (2 for 1)
#        from (irb):6:in `show'
#        from (irb):10
#        from C:/Ruby193/bin/irb:12:in `<main>'
4

2 に答える 2

2

Procs欠落している引数をnilに変換しますが、変換lambdaしません。

エラーを許容したい場合は、Procsを使用してください。そうでなければあなたは一緒に行きたいでしょうlambda

l = ->(x) { x = x * 10; puts x }
=> #<Proc:0x007fada3be9468@(pry):12 (lambda)>
l.call(10, 20)
ArgumentError: wrong number of arguments (2 for 1)
from (pry):12:in `block in <main>'
于 2013-03-11T14:45:37.277 に答える
1

これが Procs の内部的な仕組みであり、あまりにも多くの引数が渡されても気にしません。

Proc#call引数の配列を取り、それらをブロックの引数にバインドし、カウントが一致しなくても文句を言いません。

しかし、 Proc Lambda はそれについて不平を言うでしょう。それは、それらと通常の Proc との違いの 1 つです。

2.0.0p0 :006 > r = lambda { |x| puts x }
 => #<Proc:0x007fac6913b600@(irb):6 (lambda)>
2.0.0p0 :007 > r.call(1,2)
ArgumentError: wrong number of arguments (2 for 1)
from (irb):6:in `block in irb_binding'
from (irb):7:in `call'
from (irb):7
from /Users/Intrepidd/.rvm/rubies/ruby-2.0.0-p0/bin/irb:16:in `<main>'
于 2013-03-11T14:36:55.257 に答える