2009-06-08 6 views
26

Question rapide concernant l'utilisation de "SELF" dans un module ou une bibliothèque. Fondamentalement, quelle est la portée/le contexte de "SELF" en ce qui concerne un module ou une bibliothèque et comment doit-il être utilisé correctement? Pour un exemple de ce dont je parle, consultez le module "AuthenticatedSystem" installé avec "restful_authentication".(Ruby, Rails) Contexte de SELF dans les modules et bibliothèques ...?

NOTE: Je suis conscient que «soi» équivaut à «ceci» dans d'autres langues et que le «moi» fonctionne sur une classe/un objet, mais dans le contexte d'un module/bibliothèque, il n'y a rien . Alors, quel est le contexte de soi à l'intérieur de quelque chose comme un module où il n'y a pas de classe?

Répondre

44

Dans un module:

Quand vous voyez self dans une méthode d'instance, il fait référence à l'instance de la classe dans laquelle le module est inclus.

Lorsque vous voyez self en dehors d'une méthode d'instance, cela fait référence au module.

module Foo 
    def a 
    puts "a: I am a #{self.class.name}" 
    end 

    def Foo.b 
    puts "b: I am a #{self.class.name}" 
    end 

    def self.c 
    puts "c: I am a #{self.class.name}" 
    end 
end 

class Bar 
    include Foo 

    def try_it 
    a 
    Foo.b # Bar.b undefined 
    Foo.C# Bar.c undefined 
    end 
end 

Bar.new.try_it 
#>> a: I am a Bar 
#>> b: I am a Module 
#>> c: I am a Module 
+1

Précisément. Tout est un objet dans Ruby. Il n'y a pas de code local qui peut être exécuté là où il n'y a pas de soi. – Chuck

+0

Compris, alors quelle est la portée/le but de l'appel de soi dans un module? –

+0

Bonjour à tous, Toujours à la recherche d'une réponse explicite. Je réalise ce que SELF * peut * faire. Ce que j'ai besoin de savoir, c'est exactement ce que ça * fait * dans une fonction d'un module? Je suppose que certains types de variables sont définis globalement, mais je ne suis pas sûr que ce soit le cas. Quelqu'un peut-il confirmer/éclairer? –

0

Pour un bref résumé ... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

auto est également utilisé pour ajouter des méthodes de classe (ou méthodes statiques pour les C#/Java). L'extrait suivant est l'ajout d'une méthode appelée do_something à l'objet de classe actuelle (statique) ...

class MyClass 
    def self.do_something # class method 
     # something 
    end 
    def do_something_else # instance method 
    end 
end 
Questions connexes