2010-11-10 19 views
9

estoy saltando en los rieles de programación por primera vez y, mientras observa el código para algunas bibliotecas que he descargado, ocasionalmente notar el código:¿Alguien puede explicarme la clase << a mí?

class << self 
    def func 
    stuff 
    end 
end 

He intentado buscar en la web para una explicación , pero el < < se quita de la mayoría de los motores de búsqueda útiles, por lo que acaba buscando solo una clase, lo cual no es muy útil. Cualquier idea sería apreciada.

+2

es Google no es una útil herramienta de búsqueda? http://www.google.com/search?source=ig&hl=en&rlz=&=&q=class+%3C%3C+self&btnG=Google+Search – McKay

+0

@McKay: además de http://forums.pragprog.com/forums/77/topics/657, que no era exactamente lo mismo que Wade, ¿qué éxitos eran relevantes para la pregunta de Wade? –

+0

Los primeros dos hits son ambos relevantes (el tercero podría decirse que sí). El segundo enlace (http://www.thekode.net/blog/blog.html) habla sobre ese idioma específicamente y enlaces: http://www.thekode.net/ruby/techniques/DefiningMethodsWithClosures.html que también podría ser de ayuda. – McKay

Respuesta

12

En Ruby, class << foo abre la clase Singleton del objeto referenciado por foo. En Ruby, cada objeto tiene una clase singleton asociada que solo tiene una sola instancia. Esta clase singleton tiene un comportamiento específico del objeto, es decir, métodos singleton.

Por lo tanto, class << self abre la clase singleton de self. Lo que exactamente selfes, depende del contexto en el que se encuentre, por supuesto. En un cuerpo de definición de módulo o clase, es el módulo o clase en sí, por ejemplo.

Si todo lo que está utilizando la clase singleton para, está definiendo métodos singleton, en realidad hay un atajo para eso: def foo.bar.

Aquí hay un ejemplo de cómo utilizar métodos simples para proporcionar unos "procedimientos" que realmente no tienen ninguna asociación con un caso particular:

class << (Util = Object.new) 
    def do_something(n) 
    # ... 
    end 
end 

Util.do_something(n) 
+0

Entonces, ¿es básicamente la forma en que Ruby maneja lo que sería un método estático en un lenguaje como Java? ¿Hay alguna diferencia? –

+0

@Wade - la porción de def es como un método estático, sí. Pero puede manipular las variables de nivel de clase dentro del bloque de clase abierta << final, y hacer otras cosas dinámicas allí también. Las definiciones de clase de Ruby se ejecutan, no se leen estáticamente. Por ejemplo, puede ejecutar otros métodos de nivel de clase allí y definir otras clases allí. –

2

Es el equivalente de

def self.func 
    stuff 
end 

Salvo que todos los métodos anidadas en ella son los métodos de clase. Le permite declarar que una cantidad de métodos son métodos de clase, sin descodificar cada uno en self.

+0

Es bueno para más que solo métodos de clase. – Chuck

+0

Cierto, pero ese es el caso común. –

Cuestiones relacionadas