💎

Ruby 3.2 - Proc

2022/12/20に公開

Ruby 3.2 アドベントカレンダーの20日目の記事です。

https://qiita.com/advent-calendar/2022/ruby32


Proc

Proc#dup が元のオブジェクトと同じクラスのオブジェクトを返す

Bug #17545: Calling dup on a subclass of Proc returns a Proc and not the subclass - Ruby master - Ruby Issue Tracking System

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 オプション追加

Feature #15357: Proc#parameters returns incomplete type information - Ruby master - Ruby Issue Tracking System

Proc#parameterslambda が真の場合は 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