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_nameWenn 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.