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