Ich habe schon seit einiger Zeit in Ruby programmiert, aber ich verstehe nicht, wann ich Folgendes verwenden soll:
def self.METHOD_NAME
end
oder nur:
def METHOD_NAME
end
In jedem Rails-Modell. Ist "self" ein Modifikator wie "private" in Java? Wann soll ich es benutzen und wann nicht? Danke vielmals.
ruby-on-rails
ruby
Swamy g
quelle
quelle
Antworten:
def self.method_name end
definiert eine Klassenmethode.
def method_name end
definiert eine Instanzmethode.
Dies ist ein ziemlich guter Beitrag dazu.
quelle
Eine kurze Erklärung, was das bedeutet:
In Ruby können Sie Methoden für ein bestimmtes Objekt definieren:
a = "hello" def a.informal "hi" end a.informal => "hi"
Wenn Sie dies tun, wird die Klasse des Objekts a, das zur Klasse gehört
String
, in eine "Geister" -Klasse geändert, auch bekannt als Metaklasse, Singleton-Klasse oder Eigenklasse. Diese neue Klasse Superklasse istString
.Außerdem wird innerhalb von Klassendefinitionen
self
die Klasse definiert, die definiert wirdclass Greeting def self.say_hello "Hello" end #is the same as: def Greeting.informal "hi" end end
Was dort passiert, ist, dass das Objekt
Greeting
, das von Klasse istClass
, eine neue Metaklasse mit den neuen Methoden erhält, also wenn Sie aufrufenGreeting.informal => "hi"
Es gibt keine Klassenmethoden in Ruby, aber die Semantik ist ähnlich.
quelle
Eine gute Anleitung, wann Sie welche verwenden sollten:
self.
) -Methode.Überlegen Sie sich beim Erstellen einer Klassenmethode genau, zu welcher Klasse oder welchem Modul sie gehört. Wenn Sie jemals feststellen, dass Sie Code in Klassenmethoden klassenübergreifend duplizieren, berücksichtigen Sie ihn in einem Modul, das andere Klassen möglicherweise einmischen.
quelle
In diesem Zusammenhang entspricht - def self.method_name der statischen Java-Methode:
Rubin:
class HexHelper def self.to_h(num) sprintf("%x", num) end end use: HexHelper.to_h(12345)
Java:
public class HexHelper { public static String toHex(int num) { return new PrintfFormat("%x").sprintf(num); } } use: HexHelper.toHex(12345)
quelle
Selbst ist immer das aktuelle Objekt
Wenn du dich hier siehst
def self.method_name end
Sie sind nicht in einer Instanz - Methode, so ist selbst das aktuelle Klasse - Objekt.
quelle
self ist wie das Schlüsselwort this in Java. Es ist ein Verweis auf die aktuelle Objektinstanz. Wenn Ihr Modellcode eine Operation für das aktuelle Objekt ausführt, benötigen Sie wahrscheinlich eine Funktion ohne den Bezeichner self.method_name.
quelle