2010-12-30 9 views
0

インスタンス変数にデフォルト値を設定しようとしています。私はやっている:ルビのコンストラクタのNameError

module MyModule::MyOtherModule 
    class MyClass 
    attr_accessor :point 

    def initialize 
     @point = Point.new(0,1) 
    end 
    end 
end 

module MyModule 
    class Point 
    attr_accessor :x, :y 

    def initialize(x, y) 
     @x = x 
     @y = y 
    end 
    end 
end 

ポイントはまた私が書いたクラスです。面白いことに、私はこのサンプルを実行するたびに、私は得ることです:

uninitialized constant MyModule::MyOtherModule::MyClass::Point (NameError) 

しかし、私は別の方法の代わりに、コンストラクタに割り当てを移動した場合 - たとえば、FOO - エラーは発生しません。これは、モジュールの場所に関連するものではないことを示唆していると思います。だから何が問題なの?

答えて

2

モジュール=!モジュール

クラス=!クラス

この場合、モジュールとクラスはRubyの定数ですので、このコードは間違っています。適切なモジュールとクラスの構成がダウンケースされます。それが最初です。

第2に、あなたの質問に答えるために、実際にPointクラスの定義がどのように見えるか、そしてMyClassをインスタンス化する方法を調べる必要があります。メッセージがクリアされた瞬間:uninitialized constant、スコープのどこにでもPointを見つけることができません。あなたのPointクラスがMyModuleというの範囲にあるので

EDIT

module MyModule 
    module MyOtherModule 
    class MyClass 
     attr_accessor :point 

     def initialize 
     #as mentioned by nas 
     @point = MyModule::Point.new(0,1) 
     end 
    end 
    end 
end 

module MyModule 
    class Point 
    attr_accessor :x, :y 

    def initialize(x, y) 
     @x = x 
     @y = y 
    end 
    end 
end 

obj = MyModule::MyOtherModule::MyClass.new() 
puts obj.point.x #=> 0 
puts obj.point.y #=> 1 
+0

おかげで、私はいくつかの名前の実際のコードは – Thiago

+0

@Thiagoを変更しました。これはあなたが望んだものですか? – Ernest

+0

あなたの答えが正しいです、私は必要をデバッグする必要があります。ありがとう! – Thiago

2

ので、ベストプラクティスは、そうMyModule::Pointのようにアクセスすることです。あなたのMyClassのコンストラクタのわずかな変化は、次のようになります。私は、修正されたコードでポストを更新:コメントの

def initialize 
    @point = MyModule::Point.new(0,1) 
end 
+0

それは本当です。それに言及してくれてありがとう。 +1 – Ernest