LINUX.ORG.RU

История изменений

Исправление special-k, (текущая версия) :

iMushroom

хочу обратить внимание

сеттеры переменных инстанса

Это, как бы, не так.. в руби нет понятия сеттера в принципе - есть имитация (частный случай вызова метода). Но смотрите, выглядит так, словно a - это локальная переменная, для которой переопределен оператор = (единственное отличие - необходимость использования self при присвоении). Методы a и a= даже нельзя вызвать снаружи объекта. И это не какие-то космические костыли, это элементарнейшая конструкция языка, это гибкость.

class A
  def inc_a!
    self.a += 1
    a
  end

  protected
  def a= v
    @a = v * 2
  end
  def a
    @a ||= 0
  end
end

t = A.new
p t.inc_a! #2
p t.inc_a! #6
t.a #NoMethodError
t.a = 1 #NoMethodError

Исходная версия special-k, :

iMushroom

хочу обратить внимание

сеттеры переменных инстанса

Это, как бы, не так.. в руби нет понятия сеттера в принципе - есть имитация (частный случай вызова метода). Но смотрите, выглядит так, словно a - это локальная переменная, для которой переопределен оператор = (единственное отличие - необходимость использования self при присвоении). Методы a и a= даже нельзя вызвать снаружи объекта. И это не какие-то космические костыли, это элементарнейшая конструкция языка, это гибкость.

class A def inc_a! self.a += 1 a end

protected def a= v @a = v * 2 end def a @a ||= 0 end end

t = A.new p t.inc_a! #2 p t.inc_a! #6 t.a #NoMethodError t.a = 1 #NoMethodError