Encapsulation
Инкапсуляция - это свойство объекта прятать своё состояние от внешнего мира. Напрямую с переменными класса или переменными экземпляра взаимодействовать нельзя, для взаимодействия нужны методы. Они позволяют читать и изменять состояние класса. В Ruby существует инструмент, с помощью которого можно управлять доступом к методам. Делается это с помощью ключевых слов private и protected(модификаторы доступа).
Модификатор private делает так, что методы могут вызываться только изнутри экземпляра класса -
class Animal
private
def speak
"I'm animal"
end
end
Animal.new.speak
# => NoMethodError: private method `speak' called ...
Модификатор protected делает методы доступными внутри класса и его подклассов, а также позволяющий экземплярам одного класса вызывать protected-методы друг друга. В отличие от private, методы protected можно вызывать на других объектах того же класса, что удобно для сравнения или передачи данных между ними.
class User
attr_reader :age
def initialize(age)
@age = age
end
def older_than?(other_user)
# Метод может получить доступ к защищенному методу
# другого экземпляра того же класса
self.age > other_user.age
end
protected
# Этот метод доступен для сравнения, но скрыт от прямого вызова
def age
@age
end
end
user1 = User.new(30)
user2 = User.new(25)
puts user1.older_than?(user2) # => true
# puts user1.age # => Ошибка (NoMethodError)