📑
[Bug #18622] :: と const_get で定数を参照したときに差異があるバグ報告
[Bug #18622] const_get still looks in Object, while lexical constant lookup no longer does
- 次のように
::
で定数参照した場合とconst_get
で定数参照した場合で差異があるというバグ報告
module ConstantSpecsTwo
Foo = :cs_two_foo
end
module ConstantSpecs
end
# これは定数参照できる
p ConstantSpecs.const_get("ConstantSpecsTwo::Foo") # => :cs_two_foo
# これはエラーになる
# error: const_get.rb:9:in `<main>': uninitialized constant ConstantSpecs::ConstantSpecsTwo (NameError)
p ConstantSpecs::ConstantSpecsTwo::Foo
- これは Ruby 2.5 で定数参照が変わった時に関連しているぽい
class C
end
# トップレベルで定義された定数は暗黙的に Object の配下で定義される
class C2
end
# なので Ruby 2.4 以前では C:: で参照する事ができていたが Ruby 2.5 からはできなくなった
p C::C2
# Ruby 2.4 => C2
# Ruby 2.5 => error: `<main>': uninitialized constant C::C2 (NameError)
- 2年前のチケットなんですが、直接定数を参照したときのアクセスと矛盾しているが、互換性のためにこの挙動を維持するとのこと
Discussion