2011-02-06 16 views
12

Diciamo che ho tre classi, ciascuna definita nel proprio file. per esempio. ClasseA in ClassA.rb ecc ...Impossibile includere una classe in un'altra classe in Ruby: costante non inizializzata (NameError)

class ClassA 
    def initialize 
    end 

    def printClassA 
    puts "This is class A" 
    end 
end 

class ClassB 
    def initialize 
    end 

    def printClassB 
    puts "This is class B" 
    end 
end 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

Come si può vedere, ClassC ha bisogno delle altre due classi, al fine di funzionare correttamente. Presumo, ci deve essere un modo per importare/includere/caricare le altre due classi in ClassC.

Sono nuovo di Ruby e ho provato ogni permutazione di carico/include/require e non riesco a capire come farlo funzionare.

Io di solito appena ottenere:

classc.rb:2:in `<class:ClassC>': uninitialized constant ClassC::ClassA (NameError) 
    from classc.rb:1:in `<main>' 

O un errore di sintassi con la mia import/include/richiedono dichiarazioni.

Utilizzando Windows 7, Ruby 1.9.2, RadRails, tutti i file si trovano nello stesso progetto e nella cartella di origine.

Mi dispiace se questa domanda è simile ad alcune delle altre domande qui, ma la maggior parte delle risposte alla risoluzione della "costante non inizializzata" è "richiede solo il file". Ho provato e non funziona.

risposta

19

Penso che il tuo problema è che $:, la variabile che controlla dove require cerca i file, non include più la directory corrente in Ruby 1.9.2 e successive (per motivi di sicurezza). A dire Rubino dove cercare il file, è necessario fare una delle:

require_relative 'ClassA' # which looks in the same directory as the file where the method is called 

# or # 

require './ClassA' # which looks in the current working directory 
+0

Grazie mille. Wow – user604886

3

Se continuo a tutto in un unico file, e aggiungere due righe al codice funziona bene su 1.9.2:

class ClassA 
    def initialize 
    end 

    def printClassA 
    puts "This is class A" 
    end 
end 

class ClassB 
    def initialize 
    end 

    def printClassB 
    puts "This is class B" 
    end 
end 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 
# >> This is class A 
# >> This is class B 

Questo mi dice che il codice va bene, il problema è nella tua inclusione dei file.

ho diviso le prime due classi in file separati, "classa.rb" e "classb.rb", rispettivamente, poi modificato il file:

require_relative './classa' 
require_relative './classb' 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 

Dopo l'esecuzione di esso ho ottenuto gli stessi risultati che mostra ha funzionato correttamente.

Io uso './path/to/file' perché è auto-documentante dove sto cercando, ma 'percorso/su/file', o, in questo caso 'classa' funzionerebbe pure.

Quindi, sono passato a Ruby 1.8.7 e ho modificato le linee require_relative in require e ho salvato di nuovo il file. L'esecuzione dalla riga di comando ha funzionato correttamente ancora una volta:

require './classa' 
require './classb' 

class ClassC 

    def initialize 
    end 

    def bothClasses 
    a = ClassA.new 
    b = ClassB.new 
    a.printClassA 
    b.printClassB 
    end 
end 

c = ClassC.new 
c.bothClasses 

Per motivi di sicurezza, Ruby 1.9+ rimosso la directory corrente '' dall'elenco delle directory cercate da require. Poiché sapevano che li avremmo cacciati con forconi e torce, hanno aggiunto il comando require_relative, che consente la ricerca nella directory corrente e sotto.

+0

Li hai messi in tre file separati? Funzionerà bene se sono tutti nello stesso file .rb. – user604886

+0

Prova a leggere la risposta ora. Ho finito di modificarlo. –

Problemi correlati