ブログ記事からの転載です。
某所で話題になっているやつです。
Ruby では Kernel.#lambda
で proc
オブジェクトを生成した場合 lambda
として生成されます。
# Kernel.#proc だと lambda でないオブジェクトを生成する
proc_obj = lambda { |a, b| "#{a}:#{b}" }
pp proc_obj.lambda?
# => false
# 引数は厳密にチェックしないので OK
proc_obj.call 1
# Kernel.#lambda だと lambda なオブジェクトを生成する
lambda_obj = lambda { |a, b| "#{a}:#{b}" }
pp lambda_obj.lambda?
# => true
# 引数を厳密にチェックするのでエラーになる
# in `block in <main>': wrong number of arguments (given 1, expected 2) (ArgumentError)
lambda_obj.call 1
Kernel.#lambda
に proc
なオブジェクトを渡した場合
次のように Kernel.#lambda
に proc
なオブジェクトを渡した場合、lambda
なオブジェクトではなくて proc
なオブジェクトのままになります。
proc_obj = proc { |a, b| "#{a}:#{b}" }
lambda_obj = lambda &proc_obj
pp lambda_obj.lambda? # => false
pp lambda_obj.call 42 # => "42:"
意図としては lambda
なオブジェクトになってほしいところではあるんですが、うーん。
lambda
と proc
は next
や return
の挙動も異なるので単純に lambda
化する、っていう対応をしても難しい気がする。
しかし、少なくとも現状の挙動はコードの意図する動作ではないので何かしらの対応が入ってほしい気持ち。
個人的には変換されないなら例外を吐いてほしいなー。