📝

[Bug #20974] proc と lambda で Proc#parameters の結果が異なるというバグ報告

2025/01/17に公開

[Bug #20974] Required and optional anonymous parameter show differently in Proc#parameters

  • 以下のような匿名引数の場合に proclambdaProc#parameters の結果が異なるというバグ報告
p(proc { |(_a)| }.parameters)   # => [[:opt, nil]]
p(lambda { |(_a)| }.parameters) # => [[:req]]
# ブロックの引数の名前やデフォルト値が取得できる
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]]
GitHubで編集を提案

Discussion