Ruby Private & Protected Methoden: Methodensichtbarkeit verstehen

Was ist eine private Methode in Ruby?

Es ist ein Methodentyp, den Sie NUR innerhalb der Klasse aufrufen können, in der er definiert ist.

Hiermit können Sie den Zugriff auf Ihre Methoden steuern.

Eine Ruby-Methode kann:

  • privat
  • öffentlich (Standard)
  • geschützt

Standardmäßig sind ALLE Ihre Methoden public .

Jeder kann sie benutzen!

Aber Sie können dies ändern, indem Sie eine Methode private oder protected .

Warum ist das nützlich?

Weil Sie diese Methoden einfacher ändern können.

Stellen Sie sich vor, Sie schreiben eine Codebibliothek, die in verschiedenen Projekten bei der Arbeit verwendet wird.

Wenn diese Projekte Ihre Bibliothek implementieren, rufen sie Methoden für die von Ihnen erstellten Klassen auf.

Jetzt:

Sie veröffentlichen eine neue Version …

Aber Sie haben beschlossen, den Namen einer public -Methode zu ändern.

Das wird bei jedem Projekt, das diese Methode verwendet, zu Fehlern führen!

Erinnere dich daran:

Durch WENIGER öffentliche Methoden ERHÖHEN Sie die Änderungsfreiheit innerhalb Ihrer Klasse.

Sehen wir uns ein paar Codebeispiele an!

Private Methoden in Ruby verstehen

Haben Sie jemals die Fehlermeldung „private Methode aufgerufen“ gesehen?

Dieser:

self.puts 123# NoMethodError: private method `puts' called

Dann haben Sie versucht, eine private -Methode falsch zu verwenden.

Sie können nur eine private Methode selbst verwenden.

Beispiel:

puts 123

Es ist die gleiche Methode, aber Sie müssen es so nennen.

Private Methoden werden immer im Kontext von self aufgerufen.

Mit anderen Worten…

Sie können nur private Methoden mit:

  • Andere Methoden aus derselben Klasse
  • Von der übergeordneten Klasse geerbte Methoden
  • Methoden aus einem Modul

Dies bedeutet, dass Sie keine privaten Methoden von außerhalb der Klasse aufrufen können, die sie definiert.

Weil das einen „expliziten Empfänger“ erfordern würde.

Es sei denn…

Sie verwenden eine Methode wie send, um diese Regel zu umgehen.

send(:puts, "apple")

Wie definieren Sie eine private -Methode?

def bacon "private bacon"endprivate :bacon

Das Wort private selbst ist kein Schlüsselwort, sondern eine Methode, die im Modul Kernel definiert ist.

Wo Sie Ihre privaten Methoden ablegen können

Es ist normal, dass eine Klasse mehr als eine private Methode hat.

Wo platzieren Sie diese Methoden?

Mach das:

class Food def public_method end private def bacon end def orange end def coconut endend

Jede Instanzmethode nach private wird zu einer privaten Methode.

Sie können private_class_method :method_name Wenn Sie eine Klassenmethode als privat definieren möchten

Es ist ein übliches Muster, zuerst alle Ihre öffentlichen Methoden und dann Ihre private Methoden zusammen am Ende der Klasse zu definieren.

Öffentliche Methoden

Public ist die Standardmethode Sichtbarkeit in Ruby.

Hier ist ein Beispiel:

def orange "Vitamin C"end

Wenn Sie ein Objekt food haben, das orange definiert, können Sie es folgendermaßen aufrufen:

food.orange

Wenn eine Methode privat oder geschützt gemacht wurde, können Sie sie wieder öffentlich machen.

public :orange

Was ist eine geschützte Methode?

Geschützte Methoden sind seltener.

Sie sind wie private Methoden, aber Sie können sie auf einem Objekt & nicht nur direkt aufrufen.

Wenn Sie dieses Beispiel mit private versuchen, erhalten Sie eine Fehlermeldung:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

Sie erhalten den Fehler, weil name privat wäre, sodass Sie other.name nicht ausführen können.

Aber mit protected funktioniert dieser Code!

Private vs Protected Methods

Das ist der Unterschied, die Tatsache, dass protected die Methode private behält, aber es erlaubt Ihnen auch, diese Methode für ein Objekt aufzurufen.

Mit private können Sie nur name , mit protected können Sie object.name .

Wann sollten Sie protected verwenden?

Nur wenn Sie einen ganz bestimmten Fall haben, wie die equals (==) Methode.

Die Ruby-Dokumentation empfiehlt, private anstelle von protected wann immer möglich zu verwenden.

Und da ist dieser Hinweis:

“ Eine geschützte Methode ist langsam, da sie keinen Inline-Cache verwenden kann.“

Ich war neugierig darauf, also habe ich einige Benchmarks ausgeführt:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

Das ist ein Unterschied von 8,5% in der Leistung.

Video-Tutorial

Zusammenfassung

Sie haben über Ruby-Methode Sichtbarkeit gelernt, öffentlich, privat & geschützte Methoden. Dies sind keine Ruby-Schlüsselwörter, sondern Methoden, die selbst in der Klasse Module definiert sind.



+