2009-05-16 6 views
6

J'ai un module Shish (qui agit comme une classe abstraite) et une classe de visiteurs Only_Onions.Constante non initialisée MyClass (NameError) dans Ruby

Je veux instancier Only_Onions dans le module Shish de sorte que toutes les classes qui étendent Shish puissent utiliser l'objet pour déterminer si elles ont seulement des ions.

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 

Mais je reçois une erreur « Shish constante uninitialized :: Only_Onions (NameError). Qu'est-ce que cela signifie?

Répondre

6

L'ordre de déclaration a un effet. Shish doesn Vous ne connaissez pas Only_Onions dans votre code.Si vous le modifiez, alors Only_Onions est déjà déclaré lorsque vous définissez le module Shish:

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

Cela a résolu le problème d'origine. Mais je pense que only_onions_class doit être une variable de classe. Ai-je raison? Puis-je toujours faire fonctionner le code ci-dessus correctement? – unj2

1

essayer

::Only_Onions 
+1

Je pensais que le :: est seulement quand vous avez un nom de module avant et un nom de classe après pour désigner un espace de noms? Que fait-il lorsque vous l'utilisez sans module en face de lui? Je ne suis pas familier avec ça. –

+1

Un espace de noms vide indique l'espace de noms global. So Object est à la fois "Object" et ":: Object". – Chuck

Questions connexes