😽

[Bug #20943] Data.define のブロック内で定数定義したときの話

2024/11/14に公開

[Bug #20943] Constant defined in Data.define block

  • 次のように Data.define のブロック内で定数を定義すると定義されたクラス内ではなくてトップレベルの定数として定義されます
Measure = Data.define(:amount, :unit) do
  NONE = 42
end

pp NONE #=> 42
  • これを Measure::NONE のように定義されることを期待するチケットです
  • これなんですが Data.define だけではなくて Struct.newClass.new も同じ挙動になっています
X = Struct.new do
  A = "A"
end
pp A # => "A"

Y = Class.new do
  B = "B"
end
pp B # => "B"
  • なんとなくそれはそうな気もするけど定義したクラスの配下に定義されてくれる方が直感的ではありますかねえ
  • これを回避する手段として動的に定義したクラスを継承するやり方もあります
class Measure < Data.define(:amount, :unit)
  NONE = 42
end

pp Measure::NONE #=> 42

# ただし、この場合だと継承リストに匿名クラスが存在することもコメントされている
pp Measure.ancestors
# => [Measure, #<Class:0x000073fc85097db0>, Data, Object, PP::ObjectMixin, Kernel, BasicObject]
GitHubで編集を提案

Discussion