Dans Ruby, comment appelez-vous une méthode de classe à partir d'une des instances de cette classe? Dis 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 existe-t-il un moyen de le dire sans le mentionner Truck
? Il semble qu'il devrait y en avoir.
ruby
class-method
Peter
la source
la source
SalesforceSyncJob
alors c'est plus court;)self.class
élimine le besoin de recherche / remplacement si vous renommez la classe.L'utilisation
self.class.blah
n'est PAS la même chose que l'utilisationClassName.blah
en matière d'héritage.la source
self.class
est correct pour préserver l'héritage. même s'ilmake1()
est défini dansTruck
, il fait référence àBigTruck
la méthode de classe.Pour accéder à une méthode de classe à l'intérieur d'une méthode d'instance, procédez comme suit:
Voici une solution alternative à votre problème:
Utilisons maintenant notre classe:
la source
Si vous avez accès à la méthode déléguée, vous pouvez le faire:
Alternativement, et probablement plus propre si vous avez plus d'une ou deux méthodes que vous souhaitez déléguer à la classe et à l'instance:
Un mot d'avertissement:
Ne vous contentez pas au hasard de
delegate
tout ce qui ne change pas d'état en classe et en instance, car vous allez rencontrer des problèmes de conflit de noms étranges. Faites-le avec parcimonie et seulement après avoir vérifié que rien d'autre n'est écrasé.la source
la source
Vous le faites de la bonne façon. Les méthodes de classe (similaires aux méthodes «statiques» en C ++ ou Java) ne font pas partie de l'instance, elles doivent donc être référencées directement.
Sur cette note, dans votre exemple, vous feriez mieux de faire de 'default_make' une méthode régulière:
Les méthodes de classe sont plus utiles pour les fonctions de type utilitaire qui utilisent la classe. Par exemple:
la source
default_make
devrait être une méthode d'instance. Même si c'est plus simple pour ces exemples, ce n'est pas la bonne sémantique - la valeur par défaut est un produit de la classe, pas des objets qui appartiennent à la classe.Un de plus:
la source
Voici une approche sur la façon dont vous pourriez implémenter une
_class
méthode qui fonctionne commeself.class
dans cette situation. Remarque: Ne l'utilisez pas dans le code de production, c'est pour l'intérêt :)De: Pouvez-vous évaluer le code dans le contexte d'un appelant dans Ruby? et aussi http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Peut-être que la bonne réponse est de soumettre un patch pour Ruby :)
la source
Similaire à votre question, vous pouvez utiliser:
la source