Методы доступа — это специальные методы для чтения и изменения состояния объекта. В Ruby они обеспечивают контролируемый доступ к переменным экземпляра (@vars
).
Позволяет читать значение переменной:
class Person
def initialize(name)
@name = name
end
# Геттер
def name
@name
end
end
person = Person.new("Alice")
puts person.name # => "Alice"
Позволяет изменять значение переменной:
class Person
# Сеттер (обратите внимание на =)
def name=(new_name)
@name = new_name
end
end
person.name = "Bob" # Вызов сеттера
Объединяет геттер и сеттер:
class Person
def name
@name
end
def name=(new_name)
@name = new_name
end
end
Ruby предоставляет удобные макросы для создания методов доступа:
class Person
attr_reader :name # Эквивалентно def name; @name; end
end
class Person
attr_writer :name # Эквивалентно def name=(v); @name=v; end
end
class Person
attr_accessor :name # Создает оба метода
end
Вы можете добавлять логику в методы доступа:
class BankAccount
attr_reader :balance
def balance=(amount)
raise "Balance can't be negative" if amount < 0
@balance = amount
end
end
class DataStore
def data
@data ||= load_data # Инициализация при первом доступе
end
end
Вызов сеттера:
person.name = "Alice" # Синтаксический сахар для person.name=("Alice")
Массовое создание:
attr_accessor :name, :age, :email
Наследование:
class Admin < Person
attr_accessor :privileges # Добавляет к унаследованным
end
attr_reader
— только чтениеattr_writer
— только записьattr_accessor
— чтение и запись@vars
Правильное использование методов доступа делает код: