2009-05-16 21 views
6

Ho un modulo Shish (che funziona come una classe astratta) e una classe visitatore Only_Onions.Costante non inizializzata MyClass (NameError) in Ruby

Voglio istanziare Only_Onions nel modulo Shish in modo che tutte le classi che estendono Shish possano usare l'oggetto per determinare se hanno solo__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 

Ma ottengo un errore "non inizializzato costante Shish :: Only_Onions (NameError). Che cosa significa?

risposta

6

L'ordine di dichiarazione ha un effetto. Doesn Shish So di Only_Onions nel codice. Se lo modifichi, Only_Onions viene già dichiarato quando si definisce il modulo 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

Questo ha risolto il problema originale. Ma penso che only_onions_class debba essere una variabile di classe. Ho ragione? Posso ancora fare in modo che il codice sopra funzioni correttamente? – unj2

1

provare

::Only_Onions 
+1

Ho pensato che il :: è solo quando hai un nome di modulo prima e un nome di classe dopo di esso per designare un namespace? Che cosa fa quando lo usi senza un modulo di fronte ad esso? Non ho familiarità con questo. –

+1

Uno spazio dei nomi vuoto indica lo spazio dei nomi globale. Quindi Object è sia "Object" che ":: Object". – Chuck

Problemi correlati