понедельник, 29 августа 2011 г.

Ruby: небольшой нюанс видимости атрибутов

Столкнулся с несколько неожиданной, да и неприятной, особенностью методов вида smth= — к ним невозможно обратиться без указания объекта в контексте самого этого объекта, обязательно нужно указывать self.smth, иначе происходит присваивание локальной переменной. Это касается как использования в методах того же объекта, так и в блоке, вызываемом через instance_eval(). Ниже — поясняющий пример.

class Alpha

  attr_accessor :beta, :gamma

  def delta
    beta = :BETA
    self.gamma = :GAMMA
  end

end

a = Alpha.new
a.beta = :beta
a.gamma = :gamma
a.delta

p [a.beta, a.gamma]

Выведет следующее:

[:beta, :GAMMA]

Т.е. атрибут beta не обновился.

Комментариев нет:

Отправить комментарий