2009-05-16 13 views
6

モジュールShish(抽象クラ​​スのように動作する)と訪問者クラスOnly_Onionsがあります。Rubyの初期化されていない定数MyClass(NameError)

Shishを拡張しているすべてのクラスが__onionsしか持たないとdeteremineにオブジェクトを使用できるように、ShishモジュールでOnly_Onionsをインスタンス化します。

module Shish 
    only_onions_class = Only_Onions.new 
end 

class Only_Onions 
    def for_skewer 
     return true 
    end 
end 


class Skewer 
    include Shish 

    def only_onions 
     return only_onions_class.for_skewer 
    end 

    def veg? 
     return true 
    end 
end 

しかし、私はそれが何を意味する。「初期化されていない一定のシシ:: Only_Onions(NameError)エラーが出る?

答えて

6
宣言の順序は効果があり

を試してみてください。シシdoesnのあなたのコード内でOnly_Onionsについて知っているわけではありません。これを変更すると、モジュールを定義するときにOnly_Onionsが既に宣言されています:

class Only_Onions 
    def for_skewer 
     return true 
    end 
end 

module Shish 
    only_onions_class = Only_Onions.new 
end 

class Skewer 
    include Shish 

    def only_onions 
     return only_onions_class.for_skewer 
    end 

    def veg? 
     return true 
    end 
end 
+0

これは元の問題を解決しました。しかし、私は、only_onions_classはクラス変数である必要があると思います。私は正しいですか?上記のコードを正しく動作させることはできますか? – unj2

1

::Only_Onions 
+1

私は::あなたがそれの前にモジュール名を持っていて、名前空間を指定するためにそれの後にクラス名があるときだけ::と思ったのですか?それを前にモジュールなしで使用すると、何が行われますか?私はこれに慣れていない。 –

+1

空の名前空間は、グローバル名前空間を示します。したがって、Objectは "Object"と ":: Object"の両方です。 – Chuck

関連する問題