RubyのLambda(ラムダ)とは?Procとの違いも含めてやさしく解説!
Rubyには無名関数(名前のない関数)を作るための便利な構文として、Lambda(ラムダ)があります。
ラムダは Proc
と似ていますが、動作の違いが明確にあります。
ラムダとは?
ラムダ(lambda)は、ブロックやProcと同様に、処理のかたまりをオブジェクトとして扱える構文です。
メソッドの引数として渡したり、変数に代入して再利用することができます。
ラムダの定義方法
greet = ->(name) { puts "こんにちは、#{name}さん!" }
greet.call("さくら") # → こんにちは、さくらさん!
このように、->(引数) { 処理 }
という簡潔な構文でラムダを定義できます。
または次のように lambda
キーワードでも書けます:
greet = lambda { |name| puts "こんにちは、#{name}さん!" }
ラムダとProcの違い
項目 | lambda | Proc.new |
引数の数 | 厳密(数が合わないとエラー) | ゆるい(不足してもnil) |
returnの動作 | ラムダ内で return → 呼び出し元へ戻る | Proc内で return → 定義元のメソッドも終了 |
構文 | -> {...} または lambda {} | Proc.new {} |
引数の扱い(厳密)
add = ->(a, b) { a + b }
puts add.call(2, 3) # → 5
puts add.call(1) # → エラー:引数が足りない
lambda
は引数の数を正確にチェックします。
これはコードの安全性を高めるのに役立ちます。
returnの違い
def test_lambda
l = -> { return "ラムダのreturn" }
l.call
"メソッドの最後"
end
puts test_lambda # → メソッドの最後
def test_proc
p = Proc.new { return "プロックのreturn" }
p.call
"メソッドの最後"
end
puts test_proc # → プロックのreturn
ラムダの return
は ラムダ内で完結しますが、Proc.new
の return は メソッドごと終了させてしまいます。
ラムダをメソッドの引数として渡す
def twice(proc)
proc.call
proc.call
end
greet = -> { puts "こんにちは!" }
twice(greet)
ブロックからラムダへの変換(&記号)
def run(&block)
puts "開始"
block.call
puts "終了"
end
run { puts "処理中…" }
&
を使えば、ブロックをラムダ(Proc)として受け取って操作できます。
まとめ
RubyのLambda(ラムダ)は、引数とreturnの扱いが厳密なProcの一種です。
コードの安全性を重視したい場合や、ブロックを明示的に制御したいときに便利です。
まずは ->
記法で簡単なラムダを定義し、Procとの違いを実際に試してみましょう!