2012-05-27 20 views
5

Estoy tratando de mezclar un módulo en una clase, y quiero que algunos de los métodos se comporten como métodos de clase y otros como métodos de instancia.clase << notación en los módulos

Sin embargo, yo no quiero tanto include y extend el módulo. Prefiero solo include.

Cuando envuelvo los métodos quiero ser métodos de clase en esta notación, funciona:

class << 
    # ... 
end 

Sin embargo, cuando se utiliza esta notación no funciona:

class << self 
    # ... 
end 

I sospeche que la palabra clave self está estableciendo un enlace explícito al módulo, en lugar de la clase en la que se mezcla. Pero no he visto ninguna documentación que recomienda dejar la palabra clave self desactivada cuando se utiliza la notación class <<.

¿Alguien sabe lo que está pasando con esto?


ACTUALIZACIÓN: He aquí algunos ejemplos de código para más claridad:

module M 
    class << 
    def class_method 
     puts "From inside the class_method" 
    end 
    end 

    def instance_method 
    puts "From inside the instance_method" 
    end 
end 

class Object 
    include M 
end 

class C 
end 


C.class_method 

obj = C.new 
obj.instance_method 
+1

Huh, ¿extrañé algo? 'class << end' es un error de sintaxis. – sepp2k

Respuesta

6

class << siempre debe ir seguido de un objeto. Solo class <<; end es un error de sintaxis. En su caso parece que funciona por lo siguiente:

class << 
    def class_method 
    puts "From inside the class_method" 
    end 
end 

es lo mismo que

class << def class_method 
    puts "From inside the class_method" 
    end 
end 

que es el mismo que

temp = def class_method 
    puts "From inside the class_method" 
end 
class << temp 
end 

que es el mismo que

def class_method 
    puts "From inside the class_method" 
end 
class << nil 
end 

que es t él mismo que

def class_method 
    puts "From inside the class_method" 
end 

Por supuesto que en realidad no define un método de clase. Define un método de instancia.

+0

Lol. Eso explica por qué el método de clase "aparente" tenía que estar en Object para que funcione. En realidad, fue un método de instancia singleton. Buen trabajo. – Nathan

0

Sí, si usted desea conseguir una verdadera self en el módulo que debe utilizar includedcallback. Algo parecido a este punto en la dirección correcta:

module Bar 
    def self.included(base) 
    class << base 
     def class_method 
     "class_method" 
     end 
    end 
    end 
end 

class Foo 
    include Bar 
end 


p Foo.class_method # => "class_method" 
+0

Creo que esto es lo que realmente quiere resolver su problema, pero no responde a la pregunta real de qué 'clase <<' está haciendo en comparación con 'clase << self'. –

+0

like @ sepp2k dijo 'clase << end' es un error de sintaxis. Así que, en realidad, no sé a qué se refiere Nathan :( –

+0

Gracias, nash, sé sobre el método incluido, pero descubrí que dejar el yo solo parece lograr un efecto similar. No obtengo un error de sintaxis, y lo he intentado ruby 1.8 y 1.9.3 - Publicaré un ejemplo de código completo en un momento para que otros lo prueben. – Nathan

Cuestiones relacionadas