1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】Procとlambdaの違いまとめ

Last updated at Posted at 2024-10-25

どうもこんにちは。

今回は、RubyGoldで出てきそうなProclambdaについてまとめました。

Proclambdaの比較表

もう先に比較表を載せておきます。

特徴 lambda Proc
引数のチェック 厳格にチェック。引数が不足または過剰だとエラー 引数の数に寛容。足りない場合はnilを補完する
returnの動作 lambda内でのみ終了し、呼び出し元に戻る 呼び出し元全体からreturnする
作成方法の違い lambdaまたは->で定義 Proc.newで定義

lambda

lambdaの基本構文

lambdaを使うことで、引数を受け取る無名関数を作成できます。以下は、lambdaの一般的な構文です。

my_lambda = lambda { |x, y| x + y }

または、短縮形で->(ラムダリテラル)を使うこともできます。

my_lambda = ->(x, y) { x + y }

lambdaの使い方

定義したlambdaは、callメソッドを使って実行します。引数はcallメソッドに渡します。

my_lambda = ->(x, y) { x + y }

result = my_lambda.call(2, 3)
puts result  #=> 5

result = my_lambda.call()
puts result  #=> エラー: wrong number of arguments (given 1, expected 2)

Proc

Procの基本構文

Procを使用した無名関数を定義する場合は、newメソッドを使用してProcクラスのインスタンスを作って定義します。

my_proc = Proc.new { |x, y| x + y }

Procの使い方

lambdaと同様で、callメソッドを使って実行します。

my_proc = Proc.new { |x, y| x + y }

result = my_proc.call(2, 3)
puts result   #=> 5

result = my_proc.call(2)
puts result   # => nil(yがnilとして扱われ、計算結果がnil)

Proclambda内でのreturn動作

Procの場合

Proc内で実行されたreturnは、Procの中身だけじゃなくてそのProcを含むメソッド全体を終了させます。今回で言うと、returnが実行されるProcの含まれるtest_procメソッド全体の処理が終了します。

def test_proc
  my_proc = Proc.new { return "Inside proc" }
  my_proc.call
  return "Outside proc"
end

puts test_proc  # => "Inside proc"(Procが呼び出し元のメソッドも終了させる)

lambdaの場合

lambdaの場合は、lambda内で実行されたreturnlambda内でしか効力を発揮できません。
そのため、test_lambdaメソッドは継続して実行されます。

def test_lambda
  my_lambda = -> { return "Inside lambda" }
  my_lambda.call
  return "Outside lambda"
end

puts test_lambda  # => "Outside lambda"(lambda内でのみ処理が終了し、呼び出し元に影響しない)

まとめ

Rails開発する人は、lambdaを使うと割と簡潔にメソッドを定義できたりするので覚えておくと良いと思います。

モデルで以下のように定義しておくと...

app/models/sample.rb
class Sample < ApplicationRecord
    active = -> { where(destroy_flag: false) }
end

いろんなところで、メソッドを呼び出せます。

class SamplesController < ApplicationController
    def index
        @samples = Sample.active
    end
end
1
0
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?