RubyではブロックやProc、lambdaなど様々な関数オブジェクトが存在しますが、それぞれ return の挙動が微妙に異なります。特に lambda 内で return を使った場合の動作は理解しておくとコード設計がスムーズになります。
lambdaとは何か?
Rubyの lambda は無名関数として扱えるオブジェクトです。通常のメソッドのように引数を受け取り、値を返すことができます。
基本的な書き方は以下の通りです。
my_lambda = lambda { |x| x * 2 }
puts my_lambda.call(5) # 10 が出力されます
lambda内でのreturnの挙動
lambda 内で return を使うと、その return は lambda 自身から抜けるだけで、呼び出し元のメソッドやスコープには影響を与えません。
例えば。
def test_lambda
l = lambda { return 42 }
result = l.call
puts "lambda 呼び出し後: #{result}"
puts "メソッド内続行"
end
test_lambda
この場合、lambda 内の return は 42 を返すだけで、メソッド test_lambda は正常に続行されます。
Procやブロックとの違い
Proc オブジェクトやメソッドのブロック内で return を使うと、呼び出し元のメソッド自体から抜けてしまう点が lambda と異なります。
例。
def test_proc
p = Proc.new { return 99 }
result = p.call
puts "この行は実行されません"
end
test_proc
この場合、Proc 内の return により test_proc メソッド自体が終了します。
実務での使い分け
lambda は安全に値を返しつつ、呼び出し元の処理を続行させたい場合に便利です。Proc はメソッド全体のフローを中断させたい場合に使用されます。
ユーザー入力や条件分岐で部分的に処理を止めるときなど、意図的に使い分けることで可読性と安全性を向上させられます。
まとめ
Rubyの lambda 内で return を使った場合、その return は lambda からの戻り値として機能し、呼び出し元メソッドには影響を与えません。これに対して Proc やブロック内の return は呼び出し元のメソッドを抜ける挙動となります。
この違いを理解しておくことで、意図しないメソッド脱出を防ぎ、より予測可能なコードを書くことができます。

コメント