😽
[Bug #20943] Data.define のブロック内で定数定義したときの話
[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.new
やClass.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]
- 互換性の問題などもあり挙動を変えるのはむずかしそうですねえ
Discussion