2011-08-25 12 views
6

mam coś takiego:Korzystanie z metody define_method w module, który zostanie dołączony do klasy?

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

class User 
    include MyModule 
end 

Ale to nie działa prawidłowo ... Oni nie są zdefiniowane. Muszę również korzystać z modułu, ponieważ chcę odróżnić metody z tego miejsca od zwykłych metod użytkownika. Co mi się podoba:

MyModule.instance_methods 

Proszę o pomoc .. czego mi brakuje? Próbowałem również:

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

który również nie działa:/

wyjaśnienie ... Chciałbym użyć:

User.first.foo 

nie

MyModule.foo 
+0

Wygląda dobrze: 'moduł MyModule; end' '=> zero' 'klasa Użytkownik; obejmują MyModule; end' '=> User' ' moduł MyModule; define_method (: foo) {puts "yeah!" }; end' '=> # ' ' User.new.foo' ' tak ' ' => zerowe 'MyModule.instance_methods' ' => [” foo "]' –

Odpowiedz

8

Zawsze można użyć extend self trick:

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

    extend self 
end 

Ma to wpływ na poprawę tego modułu zarówno wstawką i Singleton.

+0

nie wiedział o "rozszerzeniu siebie" dobrze wiedzieć :) – nex

7

Jeśli chcesz mieć metodę klasy, zadziała

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

MyModule.foo 
# >> yeah!