📝
[Bug #20974] proc と lambda で Proc#parameters の結果が異なるというバグ報告
[Bug #20974] Required and optional anonymous parameter show differently in Proc#parameters
- 以下のような匿名引数の場合に
proc
とlambda
でProc#parameters
の結果が異なるというバグ報告
p(proc { |(_a)| }.parameters) # => [[:opt, nil]]
p(lambda { |(_a)| }.parameters) # => [[:req]]
-
Proc#parameters
はブロックの引数の情報を取得するメソッドです - 次のように引数の情報を取得できます
# ブロックの引数の名前やデフォルト値が取得できる
p(proc { |a, b = 1, c: 2| }.parameters)
# => [[:opt, :a], [:opt, :b], [:key, :c]]
-
proc
の場合はデフォルトではオプショナル引数でlambda
の場合は必須引数になります
# opt がオプショナル引数で req が必須引数
p(proc { |a| }.parameters) # => [[:opt, :a]]
p(lambda { |a| }.parameters) # => [[:req, :a]]
- このチケットでは引数が
(_a)
のときで挙動が違う、というバグ報告みたいですね - この不具合は開発版の Ruby 3.5-dev で
proc
の場合は[:opt]
を返すように修正されました
p(proc { |(_a)| }.parameters)
# Ruby 3.4 => [[:opt, nil]]
# Ruby 3.5 => [[:opt]]
- これ、ちなみに匿名引数でない場合でも仮引数が省略されるようになっているんだけどいいのかな?
p(proc { |(a)| }.parameters)
# Ruby 3.4 => [[:opt, nil]]
# Ruby 3.5 => [[:opt]]
p(lambda { |(a)| }.parameters)
# Ruby 3.4 => [[:rqe]]
# Ruby 3.5 => [[:rqe]]
Discussion