はじめに
現場での開発にて、「Procや、lambdaってどうやって使うんだろう?」って思って、使い方が曖昧だったので、調べてみました!
よく使う技術だと思うので、ぜひ習得しましょう!
Procオブジェクトとは
処理をオブジェクトとして抽象化したもの。
これを使うことで、処理を使い回すことが可能です。
基本的な使い方
Proc.new { 処理 }
で処理を作成して、.call()
で実行出来ます。
sample = Proc.new do |name|
puts "Hello, #{name}" # 最後に評価される式の値が戻り値となる
end
sample.call("Tanaka") #=> "Hello, Tanaka"
lambdaとは?
lambdaとはProcオブジェクトを作る方法の一つで、Procと比べて引数チェックとreturnの挙動、breakの挙動に違いがあります。
sample = lambda { |name| puts "Hello, #{name}" }
sample.call('Tanaka') #=> 'Hello, Tanaka'
# 省略系
sample = ->(name) { puts "Hello, #{name}" }
sample.call('Tanaka') #=> 'Hello, Tanaka'
引数チェックの相違
<Proc.newの場合>
引数が多い場合は、先頭から必要な数分だけ取って残りは無視する。
少ない場合は、足りない部分にnilを割り当てるます。
proc_sample = lambda do |a, b, c|
p [a, b, c]
end
proc_sample.call(1, 2) #=> [1, 2, nil]
<lambdaの場合>
lambdaの場合は、引数の数が違うとArgumentErrorが発生します。
lambda_sample = lambda do |a, b, c|
p [a, b, c]
end
lambda_sample.call(1, 2)
=> ArgumentError: wrong number of arguments (2 for 3)
returnの挙動
<Proc.newの場合>
return後は、メソッド自体を抜け出します。
def proc_method
proc_sample = Proc.new { return p "return proc"}
proc_sample.call
p "proc method"
end
proc_method #=> "return proc"
<lambdaの場合>
lambdaの場合はreturnした後にメソッドに戻り、メソッドを最後まで実行します。
def lambda_method
lambda_sample = lambda { return p "return lambda"}
lambda_sample.call
p "lambda method"
end
lambda_method #=> "return lambda"
#=> "lambda method"
breakの挙動
<Proc.newの場合>
例外が発生する。
def proc_method
proc_sample = Proc.new do
break 1
puts :unreachable
end
proc_sample.call
p 'proc method'
end
proc_method #=> LocalJumpError: break from proc-closure
<lambdaの場合>
lambdaの場合はbreakした後にメソッドに戻り、メソッドを最後まで実行します。
def lambda_method
lambda_sample = lambda do
break 1
puts :unreachable
end
lambda_sample.call
p "lambda method"
end
lambda_method #=> "lambda method"
おわりに
Procとlambdaの違いを理解して利用することで、現場での開発でも再利用可能で綺麗なコードを書くことが出来そうですね!