2012-07-03 7 views

Trả lời

11

sử dụng define_method như thế này:

class Foo 
    def self.add_fizz_method &block 
    define_method 'fizz', &block 
    end 
end 

class Bar < Foo; end 

begin 
    Bar.new.fizz 
rescue NoMethodError 
    puts 'method undefined' 
end 

Bar.add_fizz_method do 
    p 'i like turtles' 
end 
Bar.new.fizz 

đầu ra:

method undefined 
"i like turtles" 
+0

hầu hết những gì tôi cần. vấn đề là - & block 'tự nên là ví dụ của Bar. vì vậy nó sẽ có thể viết một cái gì đó như thế này: class Bar; add_fizz_method; p self.bar_name; kết thúc ; end –

+0

thử 'p self.class' bên dưới' p 'i like turtles''. 'self' đã là một thể hiện của' Bar'. –

+0

Btw: nếu bạn muốn trả về 'nil' thay vì ném một' NoMethodError' trước khi gọi 'add_fizz_method', bạn có thể khai báo một phương thức' fizz' trống trong lớp 'Foo'. –

7
define_method 'fizz' do 
    puts 'fizz' 
end 

... hoặc chấp nhận một khối

define_method 'fizz', &block