Sich selbst benutzen. oder nicht .. in Rails

76

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.

Swamy g
quelle
5
"self" entspricht in diesem Zusammenhang "static" in Java. In diesem Fall bezieht sich self auf die KLASSE (im Gegensatz zum Objekt). Ruby-Klassen können auch private und geschützte Deklarationen haben. Ruby verwendet auch self als "this" -Referenz innerhalb der OBJECT INSTANCE.
Toby Hede

Antworten:

126
def self.method_name
end

definiert eine Klassenmethode.

def method_name
end

definiert eine Instanzmethode.

Dies ist ein ziemlich guter Beitrag dazu.

DanSingerman
quelle
37

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 ist String.

Außerdem wird innerhalb von Klassendefinitionen selfdie Klasse definiert, die definiert wird

class 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 ist Class, eine neue Metaklasse mit den neuen Methoden erhält, also wenn Sie aufrufen

Greeting.informal
=> "hi"

Es gibt keine Klassenmethoden in Ruby, aber die Semantik ist ähnlich.

krusty.ar
quelle
11

Eine gute Anleitung, wann Sie welche verwenden sollten:

  • Wenn die Methode von einem internen Status des Objekts abhängt oder wissen muss, welche Instanz des Objekts adressiert wird, machen Sie sie NICHT zu einer class ( self.) -Methode.
  • Wenn die Methode nicht vom Status des Objekts oder von einer bestimmten Instanz des Objekts abhängt, kann in eine Klassenmethode erstellt werden.

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

Bradheintz
quelle
6

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)
Lolindrath
quelle
6

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.

theschmitzer
quelle
2

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.

Anurag
quelle