Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Wie self, protected und private funktioniert (Ruby)

Beitrags-Cover: Wie self, protected und private funktioniert (Ruby)
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby kann man leicht durcheinanderkommen, wenn es um Zugriffslevel auf Methoden geht - besonders in Fällen mit self. Auf den ersten Blick scheinen protected und private ähnlich zu sein, aber der Unterschied zeigt sich genau darin, wie Ruby Aufrufe über self interpretiert.
In Ruby kann jede Methode auf zwei Arten aufgerufen werden:
do_something      # ohne self
self.do_something # mit self
public - Methoden sind immer verfügbar
protected - nur für Objekte derselben Klasse oder Unterklasse verfügbar
private - nur ohne expliziten Empfänger (self) verfügbar

private - kann nicht über self aufgerufen werden

Private Methoden sind Methoden, die nur "innerhalb von sich selbst" aufgerufen werden können. Ruby erlaubt es nicht, einen Empfänger (self) anzugeben, selbst wenn es sich um dasselbe Objekt handelt.
class User
  def greet
    self.secret_message  # nicht erlaubt
  end

  def greet_ok
    secret_message       # erlaubt
  end

  private

  def secret_message
    "Hallo von privat"
  end
end

user = User.new
user.greet_ok # => "Hallo von privat"
user.greet    # => NoMethodError
private beschränkt den Aufruf nur im Kontext des aktuellen Objekts, ohne explizites self.

protected - kann über self aufgerufen werden, aber nur unter Objekten derselben Klasse

Im Gegensatz zu private erlauben protected-Methoden Aufrufe über self oder eine andere Instanz, wenn sie zur selben Klasse oder Unterklasse gehören.
class User
  def initialize(age)
    @age = age
  end

  def older_than?(other)
    self.age > other.age  # erlaubt über self
  end

  protected

  def age
    @age
  end
end

u1 = User.new(30)
u2 = User.new(20)

u1.older_than?(u2) # => true
protected wird oft verwendet, wenn man zwischen Instanzen derselben Klasse vergleichen oder interagieren möchte, aber externem Code keinen Zugriff gewähren möchte.

public - ohne Einschränkungen

Öffentliche Methoden sind immer verfügbar, sowohl mit self als auch ohne.
class User
  def greet
    self.name
  end

  def name
    "Marian"
  end
end

User.new.greet # => "Marian"

Zusammenfassend

  • public - Methoden sind für alle verfügbar.
  • protected - Methoden können über self und zwischen Instanzen derselben Klasse aufgerufen werden.
  • private - Methoden können nur ohne self innerhalb des aktuellen Objekts aufgerufen werden.
Um all dies zu merken - erstellen Sie eine rb-Datei lokal und experimentieren Sie mit dem Code. Nur durch praktische Anwendung kann man den Unterschied gut verstehen.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map
28. Okt, 10:38 Uhr

Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist
28. Okt, 14:10 Uhr

Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28. Okt, 14:42 Uhr

Wie funktioniert &:to_s in Ruby und was ist Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was sind Proc und Lambda in Ruby?
28. Okt, 15:57 Uhr

Was sind Proc und Lambda in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?
29. Okt, 17:54 Uhr

Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt
29. Okt, 18:29 Uhr

Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte
29. Okt, 20:47 Uhr

==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte

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