2016-11-01 3 views
1

Ich habe eine Klasse mit dem Attribut Accessoren:attr_accessor nicht Wert zu aktualisieren

class MyClass 
    attr_accessor :a, :b 

    def initialize 
    @a = 1 
    @b = 2 
    end 

    def update_values options 
    a = options[:a] 
    b = options[:b] 
    end 
end 

Ich denke, dass update_values nach dem Aufruf, a und b sollten ihre neuen Werte beibehalten:

describe MyClass do 
    before do 
    @thing = MyClass.new 
    end 

    it 'should set a and b' do 
    expect(@thing.a).to eq 1 
    expect(@thing.b).to eq 2 
    @thing.update_values a: 2, b: 5 
    expect(@thing.a).to eq 2 
    expect(@thing.b).to eq 5 
    end 
end 

Dies geschieht nicht - der Test schlägt fehl:

Failures: 

    1) MyClass should set a and b 
    Failure/Error: expect(@thing.a).to eq 2 

     expected: 2 
      got: 1 

     (compared using ==) 

Ist nicht wie Attribitor Accessoren funktionieren sollten? Was vermisse ich?

Antwort

1

Sie definieren nur die lokalen Variablen a und b.

Stattdessen möchten Sie neue Werte für die Instanzvariablen a und b festlegen. Hier ist, wie Sie das tun können:

def update_values options 
    self.a = options[:a] # or @a = options[:a] 
    self.b = options[:b] # or @b = options[:b] 
end 

Jetzt:

foo = MyClass.new 
#=> #<MyClass:0x007f83eac30300 @a=1, @b=2> 
foo.update_values(a: 2, b: 3) 
foo #=>#<MyClass:0x007f83eac30300 @a=2, @b=3> 
+0

Ich dachte, dass da attr_accessor die ein fügt = und b = Methoden der Klasse, die ihre Wirkung auf ‚Selbst‘ implizit sein würde - Aber ich denke, es ist eine Ruby-Parsing-Sache. = als Zuweisungsoperator hat Vorrang vor = in einem Methodennamen. Vielen Dank! –

+0

Wenn man fragt, was Andrey sagt, füge die Zeile 'p 'lokale Variablen = # {local_variables}" 'am Ende von (dem Original)' initialize' hinzu. Wenn 'foo = MyClass.new' aufgerufen wird, wird' "local variables = [: a,: b]" 'angezeigt. –

Verwandte Themen