Ruby 3.2 アドベントカレンダーの20日目の記事です。
Proc
Proc#dup が元のオブジェクトと同じクラスのオブジェクトを返す
Ruby 1.9 以降、Proc のサブクラスを dup するとサブクラスではなく Proc オブジェクトが返ってたのが、ちゃんとサブクラスオブジェクトが返るようになった。
class Hoge < Proc def inspect "instance of Hoge" end end pp Hoge.new{}.dup #=> <instance of Hoge> # Ruby 3.1 までは #<Proc:0x00007f82af54ccf0 hoge.rb:6>
Proc#parameters に lambda オプション追加
Proc#parameters
の lambda
が真の場合は lambda とみなしたパラメータを返し、偽の場合は proc とみなしたパラメータを返す。
pr = proc{|x, y=0|} pp pr.parameters #=> [[:opt, :x], [:opt, :y]] proc なので x も y もオプション pp pr.parameters(lambda: true) #=> [[:req, :x], [:opt, :y]] lambda とみなすので x は必須 pp pr.parameters(lambda: false) #=> [[:opt, :x], [:opt, :y]] proc と同じ lm = lambda{|x, y=0|} pp lm.parameters #=> [[:req, :x], [:opt, :y]] lambda なので x は必須 pp lm.parameters(lambda: true) #=> [[:req, :x], [:opt, :y]] lambda と同じ pp lm.parameters(lambda: false) #=> [[:opt, :x], [:opt, :y]] proc とみなすので x も y もオプション