💎

Ruby 3.2 - リファインメント

2022/12/16に公開

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

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


リファインメント

Module#used_refinements

Feature #14332: Module.used_refinements to list refinement modules - Ruby master - Ruby Issue Tracking System

Module.used_refinements が追加された。現在のスコープで有効な Refinement オブジェクトを返す。

module Hoge
  refine Integer do
  end
end

module Fuga
  refine String do
  end
end

Module.used_refinements  #=> []
using Hoge
Module.used_refinements  #=> [#<refinement:Object@Hoge>]
using Fuga
Module.used_refinements  #=> [#<refinement:Object@Fuga>, #<refinement:Object@Hoge>]

Module#refinements と Refinement#refined_class

Feature #12737: Module#defined_refinements - Ruby master - Ruby Issue Tracking System

Module#refinements はモジュール内で定義されている Refinement オブジェクトを返す。

module Hoge
  refine Integer do
  end
  refine String do
  end
end

Hoge.refinements  #=> [#<refinement:Integer@Hoge>, #<refinement:String@Hoge>]

Refinement#refined_class はリファインされてるクラスを返す。

module Hoge
  refine Integer do
  end
  refine String do
  end
end

r1, r2 = Hoge.refinements
r1.refined_class  #=> Integer
r2.refined_class  #=> String

Discussion