Posted at

rubyのlambdaとprocの比較実験

More than 5 years have passed since last update.

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メソッド以下は呼ばれない