Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Jak działa self, protected i private (Ruby)

Okładka posta: Jak działa self, protected i private (Ruby)
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 zawsze
protected - dostępne tylko dla obiektów tej samej klasy lub podklasy
private - 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.

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map
28 paź 10:38

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1
28 paź 14:10

Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28 paź 14:42

Jak działa &:to_s w Ruby i co to jest Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co to jest Proc i Lambda w Ruby?
28 paź 15:57

Co to jest Proc i Lambda w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)
29 paź 17:54

Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne
29 paź 18:29

Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać
29 paź 20:47

==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska