Що таке getter в Ruby?

У Ruby геттер - це метод, який дозволяє отримати значення приватної змінної об’єкта ззовні. Зазвичай, імена геттерів починаються з префіксу get_ або просто ім’ям змінної, яку вони повертають.

class MyClass
  def initialize
    @my_variable = 42
  end

  def get_my_variable
    return @my_variable
  end
end

obj = MyClass.new

value = obj.get_my_variable

puts value  # Виводить 42

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

class MyClass
  attr_reader :my_variable

  def initialize
    @my_variable = 42
  end
end

# Створюємо об'єкт класу
obj = MyClass.new

# Викликаємо геттер для отримання значення змінної @my_variable
value = obj.my_variable

puts value  # Виводить 42

Використання attr_reader автоматично визначає геттер для зазначеної змінної, у цьому випадку для :my_variable .

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

Особливості використання геттерів в Ruby.

Назви методів: У Ruby геттери зазвичай мають назву, яка відповідає назві змінної, до значення якої ми хочемо отримати доступ. Наприклад, якщо у нас є змінна @name, геттер для неї буде мати назву name.

Визначення геттерів: Геттери можуть бути визначені як вручну, так і за допомогою спеціальних ключових слів Ruby, таких як attr_reader. Використання attr_reader дозволяє автоматично створювати геттери для одного або декількох полів об’єкта. Наприклад:

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name = name
    @age = age
  end
end

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

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

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

  def name
    "Name: #{@name.capitalize}" # Додаємо додаткову логіку
  end
end

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

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

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

Захист від зміни значень. Геттери дозволяють захистити значення від випадкової зміни ззовні. Оскільки геттери лише повертають значення, їх виклик не змінює сам об’єкт.

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

  def name
    @name.freeze # Захищаємо значення від зміни
  end
end

person = Person.new("John")
person.name << " Doe" # Зараз видасть помилку, бо об'єкт заморожений

Геттери в Ruby надають зручний спосіб отримання доступу до даних об’єкта та контролю за цим доступом, що допомагає підтримувати чистоту та безпеку коду.