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.