LoginSignup
0
0

More than 1 year has passed since last update.

知識0からProcオブジェクトについて調べてみた。

Last updated at Posted at 2021-05-11

はじめに

現場での開発にて、「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の違いを理解して利用することで、現場での開発でも再利用可能で綺麗なコードを書くことが出来そうですね!

0
0
2

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
0
0