1. ホーム
  2. ルビー

[解決済み】Rubyのprocとlambdaの違いとは?

2022-04-12 09:36:44

質問

また、どのような場合にどちらかを使うのでしょうか?

どのように解決するのですか?

1つの違いは、引数の扱い方です。を使った proc を作成する場合 proc {}Proc.new {} は等価です。しかし lambda {} は、渡された引数の数をチェックする proc を提供します。から ri Kernel#lambda :

に相当します。 Proc.new ただし、結果の Proc オブジェクトは、呼び出されたときに渡されたパラメータの数をチェックします。

一例です。

p = Proc.new {|a, b| puts a**2+b**2 } # => #<Proc:0x3c7d28@(irb):1>
p.call 1, 2 # => 5
p.call 1 # => NoMethodError: undefined method `**' for nil:NilClass
p.call 1, 2, 3 # => 5
l = lambda {|a, b| puts a**2+b**2 } # => #<Proc:0x15016c@(irb):5 (lambda)>
l.call 1, 2 # => 5
l.call 1 # => ArgumentError: wrong number of arguments (1 for 2)
l.call 1, 2, 3 # => ArgumentError: wrong number of arguments (3 for 2)

また、Ken が指摘するように return はそのラムダの値を返します。 return の中で、囲んでいるブロックの値を返します。

lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return

ですから、ほとんどの場合、同じように使えます。しかし、引数を自動的に厳密にチェックしたい場合(これはデバッグにも役立つことがあります)、あるいは return 文を使ってプロックの値を返します。 lambda .