2017-12-21 2 views
-1

Gibt es eine Möglichkeit, Variablen zwischen Klassen zu übergeben? Ich habe den nächsten Code.Ruby-Klassen übergeben Variablen zwischen

module Test 
    class Super 
    def initialize(name) 
     @name = name 
    end 
    end 

    class Upper 
    def test 
     puts @name 
    end 
    end 
end 

a=Test::Super.new('My name') 
b=Test::Upper.new() 
b.test() 

Vielen Dank!

+2

Welche Variable wollen Sie zwischen dem, was Klassen teilen? – sawa

+0

Wenn Sie eine andere "Test :: Super" -Instanz, z. 'a2 = Test :: Super.new ('Mein anderer Name')', was würde 'b.test()' zurückgeben? – Stefan

Antwort

1

Nein, weil a eine Instanz der Klasse ist. Zwei Antworten für dich;

1) Es ist besser Programmierpraxis zu senden a zu b. Du würdest so etwas tun. (Unter der Annahme attr_reader :name)

class Upper 
    def test(s) 
    s.name 
    end 
end 

a = Test::Super.new('My Name') 
u = Test::Upper.new 
u.test(a) 

oder man könnte es Teil des Setups haben; Ich werde Sie nicht den gesamten Code geben, aber hier ist, wie es aussehen würde

a = Test::Super.new('My name') 
b = Test::Upper.new(a) 
b.test 
=> 'My name' 

Keines dieser Beispiele ist eine besonders gute Praxis für die Klassen, aber ich denke, Sie haben eine speziellere Anwendungsfall Sie versuchen zu erreichen das wurde für den Zweck dieser Frage anonymisiert :)

+0

vermeiden Sie auch 'Super', weil es ein reserviertes Rubinwort ist – court3nay

+1

' Super' ist kein reserviertes Rubinwort. Ruby unterscheidet zwischen Groß- und Kleinschreibung. – mudasobwa

+1

Zustimmen, aber, warten Sie, bis sie etwas wie 'Super = Test :: Super machen.neu und frage mich, warum es nicht funktioniert. :) – court3nay

-1

Sie können Klassenvariablen in Modul verwenden, das nativ von Ruby unterstützt wird.

können Sie tun:

module Test 

    @@name = '' 

    class Super 
    def initialize(name) 
     @@name = name 
    end 
    end 

    class Upper 
    def test 
     puts @@name 
    end 
    end 
end 

a=Test::Super.new('My name') 
b=Test::Upper.new() 
b.test() 
+1

Bitte schlagen Sie niemals Klassenvariablen in Ruby vor. Es hat ** viele ** Nachteile für keinen Wert. Man sollte besser eine Instanzvariable auf Klassenebene von "Test" verwenden. Auch eine ungültige Deklaration von '@@ name' macht keinen Sinn. – mudasobwa

1

Wenn aus irgendeinem Grund Instanzen der Klasse Upper Notwendigkeit, einen Zugang zu den Interna von Instanzen der Klasse haben Super, es bedeutet, dass Sie einen Konstruktionsfehler haben.

module Test 
    class Super 
    def initialize(name) 
     @name = name 
    end 
    def name 
     @name 
    end 
    end 
end 

Nun könnte man die name mit Test::Super.new("my name").name erhalten:

Eine Möglichkeit Super Bedürfnisse über einen Getter die Variable aussetzen würde.


Eine andere Möglichkeit ist Upper tatsächlich eine Unterklasse von Super ist:

class Upper < Super 
    def test 
    puts @name 
    end 
end 

Jetzt wird Test::Upper.new("my name").test"my name" drucken, weil Upper von Super die Umsetzung ableitet.


Auch könnte man eine Instanzvariable auf der umschließenden Modulebene verwenden:

module Test 
    def self.name=(name) 
    @name = name 
    end 
    def self.name 
    @name 
    end 

    class Super 
    def initialize(name) 
     Test.name = name 
    end 
    end 

    class Upper 
    def test 
     puts Test.name 
    end 
    end 
end 

Dies würde drucken:

▶ Test::Super.new("my") 
#⇒ #<Test::Super:0x0055dae57fe390> 
▶ Test::Upper.new.test 
#⇒ "my" 
Verwandte Themen