En Ruby, à l'intérieur d'une méthode de classe, est une auto de la classe ou d'une instance?
Je sais que self
est l'exemple à l'intérieur d'une méthode d'instance. Alors, est self
la classe à l'intérieur d'une méthode de classe? E. g., Sera la suite des travaux dans les Rails?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
- Et pour ajouter à la ci-dessous les réponses, puisque ruby toujours évaluer le récepteur en soi, sauf si spécifié, votre code ci-dessus peut simplement appeler
find_by_name
sans l'auto 🙂 - Merci, il y a des cas où il est une bonne idée de préciser
self
? Estself.find_by_name
la première place Ruby serait à la recherche defind_by_name
? Faut-il chercher ailleurs? Qu'en est dans le monde une méthode définie (une méthode définie dans le fichier à l'extérieur de la classe)? - Je l'ai testé. Il semble que l'ordre de priorité est la méthode de la classe et puis les globalement défini méthode si aucune méthode de classe est trouvé.
- J'ai créé un diagramme de la méthode de recherche afin de Ruby. Vous trouverez peut-être utile.
- Au moins en Ruby 1.9.2, ‘globalement défini " les méthodes sont en fait des méthodes privées sur
Object
. Essayez, par exemple:def foo; end; Object.private_methods.include?(:foo) # => true
. Cela signifie qu'en gros, ils finissent au sommet de la chaîne d'héritage, et sont dernier afin d'être trouvé.
Vous devez vous connecter pour publier un commentaire.
Qui est correct.
self
à l'intérieur d'une méthode de classe est la classe elle-même. (Et aussi à l'intérieur de la définition de la classe, comme leself
dansdef self.coolpost
.)Vous pouvez facilement tester ces petites bouchées avec de la cisr:
de sortie:
Maintenant, si vous voulez un Rails de solution spécifique, il est appelé named_scopes:
Utilisée comme ceci:
Beaucoup de réponses déjà, mais ici, c'est pourquoi auto est la classe:
La pastille qui change de
self
à tout ce qui est avant le point. Donc, quand vous nefoo.bar
puis pour lebar
-méthode,self
estfoo
. Il n'y a pas de différence avec les méthodes de la classe. Lors de l'appel dePost.cool_post
, vous allez changerself
àPost
.La chose importante à noter ici est que ce n'est pas la façon dont la méthode est définie, qui détermine
self
, mais comment il s'appelle. C'est pourquoi cela fonctionne:Ou ceci:
Réponse courte: oui
Ce que j'aime à voir avec ces questions est juste tirer un irb ou ./script/console de session
et puis vous pouvez faire ce qui suit pour voir la magie:
Heureux de pêche!