💎
Ruby 3.2 - Proc
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 もオプション
Discussion