2016-11-01 2 views
1

У меня есть класс с атрибутом аксессорами:attr_accessor не обновляет значение

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 

Я думаю, что после вызова update_values, a и b должна сохранять свои новые значения:

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 

Это не происходит - испытание не выполнено:

Failures: 

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

     expected: 2 
      got: 1 

     (compared using ==) 

Не является это как должны работать атрибуторы доступа? Что мне не хватает?

ответ

1

Вы просто определяете локальные переменные a и b.

Вместо этого вы должны установить новые значения для переменных экземпляра a и b. Вот как вы можете сделать это:

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

Сейчас:

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

Я думал, что из-за attr_accessor добавляет а = а б = методы в классе, что их действие на «я» будет подразумеваться - но я предполагаю, что это рубинский парсинг. = как оператор присваивания имеет приоритет над = в имени метода. благодаря! –

+0

Если кто-то задает вопрос, что говорит Андрей, добавьте строку 'p 'local variables = # {local_variables}" 'в конце (оригинал)' initialize'. Когда вызывается 'foo = MyClass.new', отображаются« local variables = [: a,: b] »'. –

Смежные вопросы