2011-08-25 16 views
6

tôi có một cái gì đó như thế này:Sử dụng define_method bên trong một Module được đưa vào bên trong một Class?

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

class User 
    include MyModule 
end 

Nhưng điều này không làm việc như dự định ... Họ không được định nghĩa. Ngoài ra tôi cần sử dụng Mô-đun vì tôi muốn phân biệt các Phương thức từ đó từ các Phương thức Người dùng thông thường. Tôi làm như thế này:

MyModule.instance_methods 

Xin vui lòng giúp đỡ .. tôi đang thiếu gì? Tôi cũng đã cố gắng:

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

mà cũng không làm việc:/

để làm rõ ... Tôi muốn sử dụng:

User.first.foo 

không

MyModule.foo 
+0

Có vẻ ổn với tôi: 'mô-đun MyModule; end' '=> nil' 'người dùng cấp; bao gồm MyModule; end' '=> Người dùng' ' mô-đun MyModule; define_method (: foo) {puts "yeah!" }; end' '=> # ' 'User.new.foo' ' vâng ' '=> nil' ' MyModule.instance_methods' ' => [" foo "]' –

Trả lời

8

Bạn luôn có thể sử dụng extend self lừa:

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

    extend self 
end 

này có tác dụng làm cho mô-đun này cả một mixin và một singleton.

+0

không biết về "tự mở rộng" tốt để biết :) – nex

7

Nếu bạn muốn có một phương pháp lớp học, những điều sau đây sẽ hoạt động

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

MyModule.foo 
# >> yeah! 
Các vấn đề liên quan