私は最近、Ruby(2.2.1)に「面白い」動作がいくつかあることを発見しました。Rubyのオブジェクト#const_getは実際にどのように機能しますか?
module Foo
class Foo
end
class Bar
end
end
Foo.const_get('Foo') #=> Foo::Foo
Foo.const_get('Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo') #=> Foo
Foo.const_get('Foo::Bar') #=> NameError: uninitialized constant Foo::Foo::Bar
Foo.const_get('Foo::Foo::Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo::Foo::Bar') #=> NameError: uninitialized constant Foo::Foo::Bar
Foo.const_get('Foo::Foo::Foo::Foo::Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo::Foo') #=> Foo::Foo
Foo.const_get('Foo::Foo::Foo::Foo') #=> Foo
Foo.const_get('Foo::Foo::Foo::Foo::Foo') #=> Foo::Foo
Foo.const_get('Foo::Foo::Foo::Foo::Foo::Foo') #=> Foo
これは少し驚くべきことです。私の理解は、const_get
が受信側の定数コレクションで定数を探してから、Objectの定数を調べるというものでした。いいよ。なぜ、第4のFoo#const_get
は失敗し、第3のものは失敗しますか?
また、Foo#const_get
を呼び出す理由が、あなたが追加した::Foo
の数に応じて、モジュールとクラスの間で交互に表示されるのは興味があります。
3番目の例を確認できますか( 'Foo.const_get( 'Foo :: Foo')')? 'Foo :: Foo'ではなく' Foo'だけを取得します。 – matt
@matt正しいですが、 'Foo'を返すだけです。元の質問を編集しました。 – Huliax