Ruby: l'Appel d'une méthode de la classe de l'instance
En Ruby, comment appeler une méthode de la classe de l'un de cette classe d'instances? Dire que j'ai
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
la ligne Truck.default_make
récupère la valeur par défaut. Mais est-il une façon de dire cela sans parler Truck
? Il semble comme il devrait être.
Vous devez vous connecter pour publier un commentaire.
Plutôt que de se référer à la traduction littérale du nom de la classe, à l'intérieur d'une méthode d'instance, vous pouvez simplement appeler
self.class.whatever
.Sorties:
SalesforceSyncJob
puis c'est plus court 😉self.class
élimine le besoin pour la recherche/remplacement s'il vous arrive de renommer la classe.self.class
partout, alors essayez ceci:delegate : some_class_method, to: :class
.À l'aide de
self.class.blah
n'est PAS la même que l'utilisation deClassName.blah
quand il s'agit de l'héritage.make1()
est défini dansTruck
, c'est le référencementBigTruck
's de la méthode de classe.Pour accéder à une méthode d'une classe à l'intérieur d'une méthode d'instance, procédez de la manière suivante:
Voici une autre solution pour votre problème:
Maintenant, nous allons utiliser notre classe:
Si vous avez accès à la méthode du délégué vous pouvez faire ceci:
Sinon, et sans doute plus propre si vous avez plus d'une méthode ou deux, vous voulez le délégué de classe & exemple:
Un mot de prudence:
N'est pas seulement au hasard
delegate
tout ce qui n'a pas changer l'état de classe et d'instance parce que vous allez commencer à courir dans d'étranges nom choc des questions. Le faire avec parcimonie et seulement après avoir vérifié rien d'autre n'est écrasé.Vous êtes en train de faire de la bonne façon. Les méthodes de la classe (similaire à la "statique" méthodes en C++ ou Java) ne font pas partie de l'instance, de sorte qu'ils ont à être référencé directement.
Sur cette note, dans votre exemple, vous seriez mieux servis faire "default_make' une méthode régulière:
Les méthodes de la classe sont plus utiles pour utilitaire-type de fonctions qui utilisent la classe. Par exemple:
default_make
devrait être une méthode d'instance. Même si c'est plus simple pour ces exemples, ce n'est pas le droit de la sémantique - la valeur par défaut est un produit de la classe, et non les objets qui appartiennent à la classe.Un de plus:
Voici une approche sur la façon dont vous pouvez mettre en œuvre un
_class
méthode qui fonctionne commeself.class
de cette situation. Remarque: Ne pas utiliser dans la production de code, c'est pour l'intérêt de souci 🙂À partir de: Pouvez-vous eval du code dans le contexte de l'appelant en Ruby? et aussi http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Peut-être que la solution, c'est de soumettre un patch pour Ruby 🙂
Similaires à votre question, vous pouvez utiliser: