В чем разница между этими двумя определениями инициализации класса Ruby?

Я работаю над книгой по Ruby, и автор использовал несколько иную форму для написания определения инициализации класса, чем в предыдущих разделах книги. Это выглядит так:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    self.venue = venue
    self.date = date
  end
end

В предыдущих разделах книги это определялось следующим образом:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    @date = date
  end
end

Есть ли какая-либо функциональная разница между использованием метода установки, как в первом примере, и использованием переменной экземпляра, как во втором? Кажется, они оба работают. Даже их смешивание работает:

class Ticket
  attr_accessor :venue, :date
  def initialize(venue, date)
    @venue = venue
    self.date = date
  end
end

person michaelmichael    schedule 01.05.2010    source источник
comment
+1 за то, что не программировал случайно.   -  person Andrew Grimm    schedule 04.05.2010


Ответы (1)


Поскольку метод установки был определен attr_accessor и, таким образом, ничего не делает, кроме установки переменной, нет никакой разницы между использованием метода установки и непосредственной установкой переменной.

Единственный положительный момент использования метода установки заключается в том, что если вы позже измените метод установки, чтобы сделать что-то большее, чем установка переменной (например, проверить ввод или что-то записать), эти изменения повлияют на ваш метод initialize без необходимости изменения Это.

person sepp2k    schedule 01.05.2010
comment
+1 Я обнаружил, что уведомление об изменении невозможно (или сложно и недокументировано) с @venue, только с self.venue. Если кто-нибудь знает способ наблюдения за сеттерами на основе атрибутов, дайте мне знать;) - person Jim Schubert; 02.05.2010