2011-08-25 4 views
6

Ho qualcosa di simile:Utilizzo di define_method in un modulo che viene incluso in una classe?

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

class User 
    include MyModule 
end 

Ma questo non funziona come previsto ... Essi non sono definiti. Anche io ho bisogno di usare il modulo perché voglio distinguere i metodi da lì dai normali metodi utente. Che mi piace:

MyModule.instance_methods 

Si prega di aiuto .. cosa mi manca? Ho anche provato:

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

che pure non funziona:/

per chiarire ... vorrei utilizzare:

User.first.foo 

non

MyModule.foo 
+0

Mi sembra ok: 'modulo MyModule; end' '=> nil' ' class User; include MyModule; end' '=> Utente' 'modulo MyModule; define_method (: foo) {puts "yeah!" }; FINE' '=> # ' ' User.new.foo' ' 'sì ' => quelle negative '' MyModule.instance_methods' => [" pippo "]' –

risposta

8

si può sempre utilizzare il extend self trucco:

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

    extend self 
end 

Questo ha l'effetto di rendere questo modulo sia un mixin e Singleton.

+0

non sapeva di "estendere sé", buono a sapersi :) – nex

7

Se si desidera avere un metodo di classe, il seguente funzionerà

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

MyModule.foo 
# >> yeah!