2016-05-02 17 views
0

Ich habe zwei Dateien. Datei X ist:Aufruf einer Methode innerhalb eines Moduls

module A 
    module B  
     XYZ = "5"  
     def testx 
      puts "Test" 
     end 
    end 
end 

Datei Y ist wie folgt:

require_relative "./B/X" 

def test 
puts A::B::XYZ 
puts A::B.testx 
end 

Ich versuche testx der Datei aufrufen X innerhalb Y, aber es funktioniert nicht. Der Aufruf der Konstanten XYZ ist jedoch erfolgreich.

Was mache ich falsch?

Update: Datei Y eine Klassenstruktur muss als @AlexN wies darauf hin, und schließen Modul B, dann testx kann einfach aufgerufen werden. Datei Y wird wie folgt dar:

require_relative "./B/X" 
    module A 
     class test 
     include B   
     def   
      puts self.method("testx") 
     end 
    end 
end 
+0

'XYZ' heißt eine Konstante, keine Variable, fyi. –

+0

@PetrGazarov danke für das Feedback, siehe die Bearbeitung –

Antwort

4
module A 
    module B  
     XYZ = "5"  
     def self.testx 
      puts "Test" 
     end 
    end 
end 

Das Verfahren hat eine Klassenmethode sein. Siehe dieses Beispiel https://stackoverflow.com/a/5417596/1166593.

+0

Ich scheine es zu lösen, ich brauchte tatsächlich eine Klassenstruktur in Y, und Modell B, dann kann ich nur testx –

0

Sie brauchen hier keine Klasse. Hier ist, wie es zu tun mit nur Module:

module A 
    module B  
    extend self 
    XYZ = "5"  
    def testx 
     puts "Test" 
    end 
    end 
end 

Ausführen A::B.testx jetzt gibt -Test. Das Problem bezieht sich nicht auf die Verschachtelung von Modulen. Das Problem wäre das gleiche, wenn Sie testx direkt unter A definiert hätten.

+0

Vielen Dank für Ihre Antwort, aber ich denke das "extend self" ist dann in vielen Klassen erforderlich (ich habe viele Klassen wie X), was die Klassenlösung weniger überflüssig macht, korrigiere mich, wenn ich falsch liege :) –

+1

Der Downvote gehört mir.True, das schafft eine Klassenmethode 'testx ', aber es erstellt auch eine unerwünschte Instanzmethode mit demselben Namen. Es ist eine bizarre Alternative, einfach eine Klassenmethode direkt zu erstellen. –

+0

@CarySwoveland Danke für den Kommentar/Feedback –

Verwandte Themen