LoginSignup
0
0

More than 3 years have passed since last update.

Ruby の lambda に proc オブジェクトを渡した場合、lambda オブジェクトは返ってこない

Posted at

ブログ記事からの転載です。

某所で話題になっているやつです。
Ruby では Kernel.#lambdaproc オブジェクトを生成した場合 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.#lambdaproc なオブジェクトを渡した場合

次のように Kernel.#lambdaproc なオブジェクトを渡した場合、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 なオブジェクトになってほしいところではあるんですが、うーん。
lambdaprocnextreturn の挙動も異なるので単純に lambda 化する、っていう対応をしても難しい気がする。
しかし、少なくとも現状の挙動はコードの意図する動作ではないので何かしらの対応が入ってほしい気持ち。
個人的には変換されないなら例外を吐いてほしいなー。

0
0
1

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