Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby łatwo się pogubić, gdy mowa o poziomach dostępu do metod - szczególnie w przypadkach z self. Na pierwszy rzut oka protected i private wydają się podobne, ale różnica ujawnia się w tym, jak Ruby interpretuje wywołania przez self.
W Ruby każdą metodę można wywołać na dwa sposoby:
do_something # bez self self.do_something # z self
public - metody dostępne zawszeprotected - dostępne tylko dla obiektów tej samej klasy lub podklasyprivate - dostępne tylko bez jawnego odbiorcy (self)
private - nie można wywołać przez self
Prywatne metody to metody, które można wywołać tylko "wewnątrz siebie". Ruby nie pozwala wskazać odbiorcy (self), nawet jeśli jest to ten sam obiekt.
class User
def greet
self.secret_message # nie można
end
def greet_ok
secret_message # można
end
private
def secret_message
"Hello from private"
end
end
user = User.new
user.greet_ok # => "Hello from private"
user.greet # => NoMethodError
private ogranicza wywołanie tylko w kontekście bieżącego obiektu, bez jawnego self.
protected - można wywołać przez self, ale tylko wśród obiektów tej samej klasy
W przeciwieństwie do private, metody protected pozwalają na wywołania przez self lub inny egzemplarz, jeśli należą do tej samej klasy lub podklasy.
class User
def initialize(age)
@age = age
end
def older_than?(other)
self.age > other.age # można przez self
end
protected
def age
@age
end
end
u1 = User.new(30)
u2 = User.new(20)
u1.older_than?(u2) # => true
protected często używa się, gdy trzeba porównywać lub współdziałać między egzemplarzami tej samej klasy, ale nie udostępniać dostępu zewnętrznemu kodowi.
public - bez ograniczeń
Publiczne metody są zawsze dostępne, zarówno z self, jak i bez niego.
class User
def greet
self.name
end
def name
"Marian"
end
end
User.new.greet # => "Marian"
Krótko mówiąc
- public - metody dostępne dla wszystkich.
- protected - metody można wywołać przez self i między egzemplarzami tej samej klasy.
- private - metody można wywołać tylko bez self, wewnątrz bieżącego obiektu.
Aby zapamiętać to wszystko - stwórz lokalny plik rb i eksperymentuj z kodem. Tylko w praktyce można dobrze przyswoić różnicę.
Ten post nie ma jeszcze żadnych dodatków od autora.