Що таке setter в Ruby?

У Ruby “setter” - це метод, який використовується для встановлення значення змінної об’єкта. Зазвичай setter використовується в об’єктно-орієнтованому програмуванні для зміни значень атрибутів (змінних) об’єкта.

У Ruby методи setter мають специфічну назву, яка включає знак рівності (=) в кінці. Наприклад, якщо у вас є клас з атрибутом name, то відповідний setter може виглядати так:

class Person
  def initialize(name)
    @name = name
  end

  # Getter для отримання значення атрибуту name
  def name
    @name
  end

  # Setter для встановлення нового значення атрибуту name
  def name=(new_name)
    @name = new_name
  end
end

Тепер ви можете встановити нове значення для атрибуту name , використовуючи setter:

person = Person.new("John")
puts person.name  # Виведе "John"

person.name = "Jane"
puts person.name  # Тепер виведе "Jane"

Використання setter дозволяє змінювати значення атрибутів об’єкта ззовні класу, за допомогою більш зручного синтаксису, ніж прямий доступ до змінних об’єкта.

Однак у Ruby передбачено спрощений синтаксис для визначення сеттерів, використовуючи метод attr_writer. Вищезазначений приклад може бути переписаний так:

class Person
  attr_writer :name
  def initialize(name)
    @name = name
  end

end

person = Person.new("John")
person.name = "Jane"

У останньому прикладі ми використовуємо attr_writer :name для генерації setter-методу для змінної name. Проте, нам не буде доступний автоматично згенерований getter, тому ви не зможете використовувати puts person.name для отримання значення name. Для цього передбачено метод attr_accessor, яке генерує автоматично геттер і сеттер. Приклад:

class Person
  attr_accessor :name
  def initialize(name)
    @name = name
  end

end

person = Person.new("John")
person.name = "Jane"
puts person.name #отримаємо Jane