📑

[Bug #18622] :: と const_get で定数を参照したときに差異があるバグ報告

2024/06/09に公開

[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)
GitHubで編集を提案

Discussion