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)