[ruby-dev:50738] [Ruby trunk Bug#15488] const_defined?("File::NULL") の挙動
From:
manga.osyo@...
Date:
2018-12-30 05:06:18 UTC
List:
ruby-dev #50738
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/