LoginSignup
28

More than 5 years have passed since last update.

rubyのlambdaとprocの比較実験

Posted at

lambdaについて調べてみました。
procとはblockに名前を付けれる点で似ているが、違う点がある。以下にその違いを実験したコードを書く。

1.引数の数をlambdaの引数の数を一致させなければエラーが起きる。
procだと起きない。

lambdaの引数エラー
def test1(v, code)
  code.call(v)
  #引数の数をlambdaの引数の数を一致させなければエラーが起きる。
  #procだと起きない。
end

def test2(v,v2, code)
  code.call(v,v2, 'hoge') #引数を増やす
end

lam = lambda do |v|
  return v*100
end

puts test1(1, lam) #=> 100

puts test2(2,22, lam) 
# lambda.rb:13:in `block in <main>': wrong number of arguments (3 for 1)(ArgumentError)
#   from lambda.rb:10:in `call'
#   from lambda.rb:10:in `test2'
#   from lambda.rb:19:in `<main>'

procの場合
def test_proc1(v, proc)
  proc.call(v)
end

def test_proc2(v, v2, proc)
  proc.call(v,v2)
end

pr = Proc.new do |v|
  v*100
end

puts test_proc1(1, pr) #=> 100
puts test_proc2(2,22, pr) #=> 200


2.lambdaとprocではreturnの挙動が違う。
proc内のreturnでは、メソッドの返り値になるが、
lambda内のreturnは、そうならない。

def lam_return_test
  lam = lambda do |v|
    return "#{v} lamda"
  end
  p "#{lam.call("inner")} call"#(1)
  p "after lamda call"#(2)

  "end"#(3)
end

p lam_return_test 
#=> 
# "inner lamda call" (1)
# "after lamda call" (2)
# "end" (3) lam_return_testの返り値
#
#lambda中のreturnはlambdaで完結している。
#

def proc_return_test
  proc = Proc.new do |v|
    return "#{v} proc" #(1)
  end
  p "#{ proc.call("inner") } call" #(2)
  p "after proc call" #(3)
  "end"#(4)
end

p proc_return_test

#=>
#"inner proc"(1)
#
#proc中のreturn (1)はproc_return_testの返り値となっている。
#(2)の pメソッド以下は呼ばれない

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28