Wie ruft man in Ruby eine Klassenmethode aus einer der Instanzen dieser Klasse auf? Sag ich habe
class Truck
def self.default_make
# Class method.
"mac"
end
def initialize
# Instance method.
Truck.default_make # gets the default via the class's method.
# But: I wish to avoid mentioning Truck. Seems I'm repeating myself.
end
end
Die Zeile Truck.default_make
ruft die Standardeinstellung ab. Aber gibt es eine Möglichkeit, dies zu sagen, ohne es zu erwähnen Truck
? Es scheint so, als ob es das geben sollte.
ruby
class-method
Peter
quelle
quelle
SalesforceSyncJob
dann ist es kürzer;)self.class
das Suchen / Ersetzen überflüssig, wenn Sie die Klasse umbenennen.Verwenden
self.class.blah
ist NICHT dasselbe wie Verwenden,ClassName.blah
wenn es um Vererbung geht.quelle
self.class
ist korrekt, um die Vererbung beizubehalten . Obwohlmake1()
in definiertTruck
, verweist es auf dieBigTruck
Klassenmethode.Gehen Sie wie folgt vor, um auf eine Klassenmethode innerhalb einer Instanzmethode zuzugreifen:
Hier ist eine alternative Lösung für Ihr Problem:
Verwenden wir jetzt unsere Klasse:
quelle
Wenn Sie Zugriff auf die Delegate-Methode haben, können Sie Folgendes tun:
Alternativ und wahrscheinlich sauberer, wenn Sie mehr als eine oder zwei Methoden haben, die Sie an class & instance delegieren möchten:
Ein Wort der Vorsicht:
Nicht nur zufällig
delegate
alles, was den Status nicht in Klasse und Instanz ändert, da Sie auf seltsame Probleme mit Namenskonflikten stoßen. Tun Sie dies sparsam und erst nachdem Sie überprüft haben, wird nichts anderes gequetscht.quelle
quelle
Du machst es richtig. Klassenmethoden (ähnlich wie 'statische' Methoden in C ++ oder Java) sind nicht Teil der Instanz, daher müssen sie direkt referenziert werden.
In diesem Sinne ist es in Ihrem Beispiel besser, wenn Sie 'default_make' zu einer regulären Methode machen:
Klassenmethoden sind nützlicher für Dienstprogrammfunktionen, die die Klasse verwenden. Zum Beispiel:
quelle
default_make
dies eine Instanzmethode sein sollte. Auch wenn es für diese Beispiele einfacher ist, ist es nicht die richtige Semantik - der Standard ist ein Produkt der Klasse, keine Objekte, die zur Klasse gehören.Einer noch:
quelle
Hier ist ein Ansatz, wie Sie eine
_class
Methode implementieren können , die inself.class
dieser Situation funktioniert . Hinweis: Verwenden Sie dies nicht im Produktionscode, dies ist aus Interesse :)Von: Können Sie Code im Kontext eines Anrufers in Ruby bewerten? und auch http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Vielleicht ist die richtige Antwort, einen Patch für Ruby einzureichen :)
quelle
Ähnlich wie bei Ihrer Frage könnten Sie Folgendes verwenden:
quelle