2010-12-03 4 views
17

Je sais que self est l'instance à l'intérieur d'une méthode d'instance. Donc, alors, self est la classe à l'intérieur d'une méthode de classe? Par exemple, le travail suivant dans Rails?Dans Ruby, à l'intérieur d'une méthode de classe, est-ce que self est la classe ou une instance?

class Post < ActiveRecord::Base 
    def self.cool_post 
    self.find_by_name("cool") 
    end 
end 
+5

Et d'ajouter aux réponses ci-dessous, car Ruby sera toujours évaluer le récepteur comme auto sauf indication, votre code ci-dessus peut simplement appeler 'find_by_name 'sans l'auto :) – brad

+0

Merci, y a-t-il des cas où c'est une bonne idée de spécifier' self'? Est-ce que 'self.find_by_name' est le premier endroit où Ruby rechercherait' find_by_name'? Est-ce que ça a l'air ailleurs? Qu'en est-il dans une méthode définie globalement (une méthode définie dans le fichier en dehors d'une classe)? – ma11hew28

+0

Je l'ai testé. Il semble que l'ordre de préséance soit la méthode de classe et la méthode définie globalement si aucune méthode de classe n'est trouvée. – ma11hew28

Répondre

21

C'est correct. self à l'intérieur d'une méthode de classe est la classe elle-même. (. Et aussi dans la définition de la classe, comme le self dans def self.coolpost)

Vous pouvez facilement tester ces petits morceaux avec irb:

class Foo 
    def self.bar 
    puts self.inspect 
    end 
end 

Foo.bar # => Foo 
5
class Test 
    def self.who_is_self 
     p self 
    end 
end 

Test.who_is_self 

sortie:

test

Maintenant, si vous voulez une Rails solution spécifique, il est appelé named_scopes:

class Post < ActiveRecord::Base 
    named_scope :cool, :conditions => { :name => 'cool' } 
end 

utilisé comme ceci:

Post.cool 
4

Réponse courte: oui

Ce que je voudrais faire avec ces questions est le feu juste au une session ou irb ./script/console

et la n vous pouvez faire ce qui suit pour voir la magie:

ruby-1.8.7-p174 > class TestTest 
ruby-1.8.7-p174 ?> def self.who_am_i 
ruby-1.8.7-p174 ?> return self 
ruby-1.8.7-p174 ?> end 
ruby-1.8.7-p174 ?> end 
=> nil 
ruby-1.8.7-p174 > TestTest.who_am_i 
=> TestTest 

Bonne pêche!

5

Beaucoup de réponses déjà, mais voici pourquoi auto est la classe:

Le point change self à tout ce qui est avant le point. Alors, quand vous faites foo.bar puis pour le bar -method, self est foo. Il n'y a pas de différence avec les méthodes de classe. Lorsque vous appelez Post.cool_post, vous allez changer self-Post.

La chose importante à noter ici est que ce n'est pas comment la méthode est définie qui détermine self, mais comment on l'appelle. Voilà pourquoi cela fonctionne:

class Foo 
    def self.bar 
    self 
    end 
end 

class Baz < Foo 
end 

Baz.bar # => Baz 

Ou ceci:

module Foo 
    def bar 
    self 
    end 
end 

class Baz 
    extend Foo 
end 

Baz.bar # => Baz 
Questions connexes