2011-08-25 8 views
6

que tiene algo como esto:Usando define_method dentro de un Módulo que se incluye dentro de una Clase?

module MyModule 
    define_method(:foo){ puts "yeah!" } 
end 

class User 
    include MyModule 
end 

Pero esto no funciona según lo previsto ... Ellos no están definidos. También necesito usar el módulo porque quiero distinguir los métodos de allí de los métodos de usuario normales. Que me gusta esto:

MyModule.instance_methods 

Por favor ayuda ... ¿Qué me estoy perdiendo? También probé:

module MyModule 
    (class << self; self; end).class_eval do 
    define_method(:foo){ puts "yeah!" } 
    end 
end 

que también no funciona:/

para aclarar ... Me gustaría utilizar:

User.first.foo 

no

MyModule.foo 
+0

Me parece bien: 'módulo MyModule; end' '=> nil' ' clase Usuario; incluye MyModule; end' '=> Usuario' ' módulo MyModule; define_method (: foo) {pone "yeah!" }; end' '=> # ' ' User.new.foo' ' 'sí ' => las negativas '' MyModule.instance_methods' => [" foo "]' –

Respuesta

8

siempre se puede utilizar el extend self truco:

module MyModule 
    define_method(:foo){ puts "yeah!" } 

    extend self 
end 

Esto tiene el efecto de hacer que este módulo tanto un mixin y un conjunto unitario.

+0

no sabía acerca de "extenderse" bueno saber :) – nex

7

Si desea tener un método de clase, lo siguiente funcionará

module MyModule 
    define_singleton_method(:foo){ puts "yeah!" } 
end 

MyModule.foo 
# >> yeah! 
Cuestiones relacionadas