2015-06-15 2 views
0

Я пытаюсь использовать attr_accessor внутри класса, где он определен, но безрезультатно. Почему это не работает?Использование attr_accessor изнутри класса?

Я ожидаю, что следующий на выход "нового" в IRB:

irb(main):016:0> foo = StringClass.new 
=> #<StringClass:0x2fbf2c0 @thing="old"> 
irb(main):017:0> foo.output 
old 
=> nil 
irb(main):018:0> foo.change 
=> "new" 
irb(main):021:0> foo.output 
old 
=> nil 

Вот реализация:

class StringClass 
    def initialize 
    @thing = "old" 
    end 

    attr_accessor :thing 

    def output 
    puts thing 
    end 

    def change 
    thing = "new" 
    end 
end 

Я могу видеть, что метод thing= определен. Я не понимаю, почему этот метод не вызывается, когда я пытаюсь изменить значение.

+0

Спасибо, ты прав, это я это дубликат. Как лучше всего разрешить? –

ответ

1

То есть, потому что эти методы должны вызываться с self:

class StringClass 
    def initialize 
    @thing = "old" 
    end 

    attr_accessor :thing 

    def output 
    puts self.thing 
    end 

    def change 
    self.thing = "new" 
    end 
end 
+0

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

+1

@Deejay - с syntaxt "без" 'self', Ruby не знает, пытаетесь ли вы вызвать метод (вы знаете, потому что понимаете контекст) или просто хотите создать локальную переменную. Если вы не укажете 'self' - в этом случае будет создана локальная переменная –

1

Попробуйте это -

class StringClass 
    ...... 

    def change 
    self.thing = "new" 
    end 
end 
  1. Foo = StringClass.new
  2. foo.change => "новый"
Смежные вопросы