2010-07-27 12 views
4

Possible en double:
class << self idiom in RubyRuby classe question

J'ai une question Ruby rapide. Je viens d'un arrière-plan Java/c, donc je comprends dans Ruby "self" quand référencé dans une méthode d'instance agit comme "ceci". Et "soi". Le préfixe de la méthode le définit comme une méthode de classe.

Mais qu'est-ce que cela signifie ici?

class << self 
    def some_method 
    end 
end 

Répondre

4

Ce qui se passe ici, c'est que nous rouvrons la classe d'un objet depuis l'intérieur et définissons une nouvelle méthode d'instance. C'est l'une des façons de faire ce que l'on appelle le «patchage de singe» dans Ruby. Cette méthode ajoute la méthode uniquement à l'objet actuel plutôt qu'à tous les objets de la classe.

Il est équivalent à faire:

my_obj = MyClass.new 

class << my_obj 
    def some_method 
    end 
end 

# or... 

def my_obj.some_method 
end 

est ici un bon article qui le recouvre: Learning Ruby: class << self.

+0

Quel objet actuel? – OscarRyz

+0

OscarRyz: l'instance dans laquelle le code est appelé. –

+0

Je pense que cette réponse devrait parler plus explicitement de la classe singleton ou eigenclass. "rouvrir la classe d'un objet depuis l'intérieur de lui-même" est trop vague et le mot "classe" tel qu'il est utilisé ne précise pas que la classe est la classe singleton, et pas seulement la classe renvoyée en passant 'obj.class' – horseyguy

-1

Si vous l'utilisez comme ceci:

class Foo 
    class << self 
     def something 
      puts "something" 
     end 
     def something_else 
      puts "something else" 
     end 
    end 
end 

Foo.something 

Il est un raccourci pour:

class Foo 
    def self.something 
     puts "something" 
    end 
    def self.something_else 
     puts "something else" 
    end 
end 

Je ne suis pas fan de la notation, vraiment.

+0

isn ' t self. * une méthode de classe, mais en voyant d'autres explications ci-dessus il semble que "class" self "ajoute des méthodes d'instance et pas des méthodes de classe? – kapso

+0

ce n'est pas un «raccourci» du tout.Si quelque chose que votre dernière syntaxe est une sorte de raccourci pour le premier. 'class << self' ouvre la classe propre d'un objet et peut être utilisé pour beaucoup plus que la simple définition de méthodes. – horseyguy

+0

Ce n'est qu'un raccourci si vous ajoutez beaucoup de variables de classe. J'ai laissé cette observation comme un exercice pour le lecteur, pensant qu'ils auraient l'idée que ce n'est pas quelque chose qu'ils devraient faire à moins qu'ils aient une sacrée bonne raison. Et ils ne le font pas. =] – Sniggerfardimungus

0

C'est ainsi que vous définissez des méthodes pour la classe singleton/eigen d'un objet.

class << foo 
    def bar 
    end 
end 

est équivalent à

def foo.bar 
end 
1

La syntaxe class << some_objct ouvre classe singleton s » de some_object, qui est une classe spéciale "secret" que seul cet objet appartient. En utilisant la classe singleton, vous pouvez définir les méthodes auxquelles un objet répond alors que les autres instances de sa classe normale ne le font pas.

Ainsi, par exemple:

a = "Hello world" 
b = "Hello world" # Note that this is a different String object 

class << a 
    def first_letter 
    self[0,1] 
    end 
end 

puts a.first_letter # prints "H" 
puts b.first_letter # Raises an error because b doesn't have that method 

Dans un contexte de classe, ces deux définitions de méthode sont équivalentes:

class Foo 
    def self.bar 
    puts "Yo dawg" 
    end 
end 

class Foo 
    class << self 
    def bar 
     puts "Yo dawg" 
    end 
    end 
end 

La deuxième forme peut être utile dans certaines circonstances (par exemple lorsque vous voulez déclarer attr_accessor s pour l'objet de classe lui-même).