2016-08-30 2 views
3

Ich bin sehr neu in Ruby. Ich bin vor Problem in den Variablenwert immer in self.methodZugriff Variablen in self.method in Ruby-Skript

Mein Ruby-Klasse/script sieht wie folgt aus:

class A1 
    def initialize 
    @myUtil = MyUtil.new log 
    @test_hash = @myUtil.loadPropertiesFile(File.dirname(__FILE__) + '/my-tests.properties') 
    end 

    def self.testCases 
    tests = {} 

    @test_hash.each do |k, v| 
     puts "#{k}" 
    end 

    tests 
    end 

    def launch test, testbed, h = {} 

    @test_hash.each do |k, v| 
     puts "#{k}" 
    end 

    end 
end 

Ich bin in der Lage Wert in @test_hash in Startmethode zu drucken, aber nicht in self.testCases. Wo mache ich den Fehler?

+0

Ihr Code sieht übermäßig verschachtelt aus. Was soll es tun? Oder versuchen Sie nur herauszufinden, wie Klassen in Ruby funktionieren? – Stefan

+0

Sieht so aus, als hätte jemand zu viel Zeit in Perl verbracht. Achte auf globale Variablen wie '$ test_hash' und wenn du sie deklarierst, beziehe dich immer auf sie. Es gibt keine '$' vs '@' hier wechseln. – tadman

Antwort

3

Ich sehe ein paar Fehler in Ihrem Code.

  • In Ihrer Methode initialize Sie eine globale Variable erstellt $test_hash, wann immer Sie eine $ vor einer Variablen setzen, wird es alles zur Verfügung. Das ist nichts, was Sie in diesem Fall tun möchten. Eine Instanzvariable würde in diesem Fall am besten für Sie arbeiten.

  • Ihre testCases Methode ist eine Klassenmethode, die bedeutet, dass Sie es, ohne eine neue Instanz der Klasse nennen, dh A1.new. So rufen Sie die Methode wie A1.testCases (Ruby verwendet Snake Case für Methodennamen, test_cases, nur fyi). Sie initialisiert die Variable test_hash in der initialize-Methode, die nicht automatisch aufgerufen wird, bis Sie eine neue Instanz der Klasse erstellen. Daher existiert test_hash nicht, wenn Sie einfach "A1.testCases" ausführen.

  • für die Linie puts "#{k}" ist keine gute Praxis. puts steht für put string und konvertiert die Variable automatisch in eine Zeichenfolge. Sie sollten puts k verwenden. Die #{} ist für die String-Interpolation gedacht. Wie "Hallo, mein Name ist # {Name}, und ich bin # {Alter} Jahre alt."

Hier ist, wie ich das tun würde. Ich ersetzte die test_hash durch einen einfachen Hash für Testzwecke.

class A1 
    def initialize 
    @test_hash = {a: 1, b: 2, c: 3, d: 4, e: 5} 
    end 

    def testCases 
    @test_hash.each do |k, v| 
     puts k 
    end 
    end 
end 

Nun können Sie eine neue Instanz von A1 erstellen und rufen Sie die testCases Methode (nun eine Instanzmethode, statt eine Klassenmethode)

A1.new.testCases 
+0

Es ist auch verwirrend, dass 'Tests' in der Methode erstellt und niemals verwendet werden, sondern einfach einen leeren Hashwert ohne ersichtlichen Grund zurückgibt. Auch "# {k}" ist eine schlechte Angewohnheit. Just 'puts k', Konvertierung erfolgt automatisch. – tadman

+0

Das ist ein guter Punkt, ich werde meine Antwort aktualisieren – davidhu2000

+0

Hey, @ davidhu2000, Ihre Änderung funktioniert. Eigentlich war meine Frage, wie ich die "@test_hash" Variable verwenden kann, die in "self.someMethod" in der Methode initialize ist? –

2

Der schwierige Teil, dass in Ruby zu verstehen ist, Klassen sind auch ein Objekt. So ist a1 = A1.new ein Objekt und A1 ist auch ein Objekt.

Mithilfe von @ innerhalb initialize erstellen Sie eine Instanzvariable, die zu a1 = A1.new Objekt gehört.

Mit @ innerhalb self.testCases Methode erstellen Sie Instanzvariable, die zu A1 Objekt gehört.

Verwandte Themen