39787


通常のクラスでは、自身のクラス名は、問題なく解決できます。

[code]

    class Hoge
      def new_my_class
        Hoge.new
      end
    end
    
    h = Hoge.new
    p h.new_my_class
    # => #<Hoge:0x000000032f6b58>
    
[/code]

BasicObject を継承したクラスでは、これができないことがわかりました。

[code]

    class HogeBasic < BasicObject
      def new_my_class
        HogeBasic.new
      end
    end
    
    h = HogeBasic.new
    p  h.new_my_class
    # # 以下の例外が発生する。
    # NameError: uninitialized constant HogeBasic::HogeBasic
    # Did you mean?  HogeBasic
    
[/code]

これは、なぜなのでしょうか？


CC BY-SA 3.0
2017-11-21T17:35:59.447
39744
2017-11-23T13:18:47.277
754
question
ruby
BasicObject を継承すると、自身のクラス名を解決できないのはなぜ？


リファレンスマニュアルに次のようにあります。  
<https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#const>

> クラス定義の外(トップレベル)で定義された定数は Object に所属することになります

なので Hoge も HogeBasic も Object に属する定数になります。

Hoge クラスは Object のサブクラスなので、Hoge の中で定数を参照すると Object に属する定数 Hoge
も参照できますが、HogeBasic クラスは Object のサブクラスではないので、HogeBasic の中で定数を参照しても Object
に属する定数 HogeBasic は参照できません。

なお `::HogeBasic` として参照することはできます。


CC BY-SA 3.0
2017-11-23T12:18:28.427
39787
2017-11-23T13:18:47.277
2017-11-23T13:18:47.277
3249
3249
39744
answer