From: manga.osyo@... Date: 2018-12-30T05:06:18+00:00 Subject: [ruby-dev:50738] [Ruby trunk Bug#15488] const_defined?("File::NULL") の挙動 Issue #15488 has been updated by osyo (manga osyo). ちょっと調べてみたんですが、次のように `include` したモジュールの定数の場合は `false` が返ってくるのが原因なようですね。 ```ruby module M HOGE = 42 end class X include M end p Object.const_get("X::HOGE") # => 42 p Object.const_defined?("X::HOGE") # => false ``` `File::NULL` も実際には `File::Constants::NULL` で定義されており、`File::Constants` を `include` しているようです。 see: https://docs.ruby-lang.org/ja/latest/class/File=3a=3aConstants.html ```ruby p Object.const_defined?("File::NULL") # => false p Object.const_defined?("File::Constants::NULL") # => true ``` ---------------------------------------- Bug #15488: const_defined?("File::NULL") の挙動 https://bugs.ruby-lang.org/issues/15488#change-76002 * Author: shuujii (Shuji KOBAYASHI) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- `const_get` と `const_defined?` について、例えば `Math::PI` では以下のようになり どちらも期待通りの結果になります。 ~~~ruby p Object.const_get("Math::PI") #=> 3.141592653589793 p Object.const_defined?("Math::PI") #=> true ~~~ 一方、`File::NULL` の場合は以下のように `const_get` で値が取得できるのに `const_defined?` が `false` になります。 ~~~ruby p Object.const_get("File::NULL") #=> "/dev/null" p Object.const_defined?("File::NULL") #=> false ~~~ これは意図的でしょうか。 -- https://bugs.ruby-lang.org/