ЗмістНатисність на посилання, щоб перейти до потрібного місця
В Ruby легко заплутатись, коли мова йде про рівні доступу до методів - особливо у випадках із self. На перший погляд protected і private здаються схожими, але різниця проявляється саме у тому, як Ruby трактує виклики через self.
У Ruby будь-який метод можна викликати двома способами:
do_something # без self self.do_something # з self
public - методи доступні завждиprotected - доступні тільки для об’єктів одного класу або підкласуprivate - доступні лише без явного отримувача (self)
private - не можна викликати через self
Приватні методи - це методи, які можна викликати лише "всередині себе". Ruby не дозволяє вказувати отримувача (self), навіть якщо це той самий об’єкт.
class User
def greet
self.secret_message # не можна
end
def greet_ok
secret_message # можна
end
private
def secret_message
"Hello from private"
end
end
user = User.new
user.greet_ok # => "Hello from private"
user.greet # => NoMethodError
private обмежує виклик тільки у контексті поточного об’єкта, без явного self.
protected - можна викликати через self, але лише серед об’єктів того самого класу
На відміну від private, методи protected дозволяють виклики через self або інший екземпляр, якщо вони належать одному класу або підкласу.
class User
def initialize(age)
@age = age
end
def older_than?(other)
self.age > other.age # можна через self
end
protected
def age
@age
end
end
u1 = User.new(30)
u2 = User.new(20)
u1.older_than?(u2) # => true
protected часто використовують, коли потрібно порівнювати або взаємодіяти між екземплярами одного класу, але не надавати доступ зовнішньому коду.
public - без обмежень
Публічні методи доступні завжди, як з self, так і без нього.
class User
def greet
self.name
end
def name
"Marian"
end
end
User.new.greet # => "Marian"
Якщо коротко
- public - методи доступні для всіх.
- protected - методи можна викликати через self і між екземплярами одного класу.
- private - методи можна викликати тільки без self, всередині поточного об’єкта.
Щоб запам'ятати це все діло - створіть rb файл локально та поексперементуйте з кодом. Тільки на практиці можна добре засвоїти різницю.
Цей допис поки що не має жодних доповнень від автора/ки.