2012-07-03 74 views
8

我想通過父類的類方法動態創建子類的實例方法。如何動態定義ruby中的實例方法?

class Foo 
    def self.add_fizz_method &body 
    # ??? (This is line 3) 
    end 
end 

class Bar < Foo 
end 
Bar.new.fizz #=> nil 

class Bar 
    add_fizz_method do 
    p "i like turtles" 
    end 
end 
Bar.new.fizz #=> "i like turtles" 

在第3行寫什麼?

回答

11

使用define_method這樣的:

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 

輸出:

method undefined 
"i like turtles" 
+0

幾乎我需要什麼。問題是 - &block's self應該是Bar的實例。所以可以寫這樣的東西:class Bar; add_fizz_method做; p self.bar_name;結束 ;結束 –

+0

在'p'下面嘗試'p self.class'我喜歡turtles''。 'self'已經是'Bar'的一個實例。 –

+0

Btw:如果你想在調用add_fizz_method之前返回'nil'而不是拋出'NoMethodError',你可以在'Foo'類中聲明一個空的'fizz'方法。 –

7
define_method 'fizz' do 
    puts 'fizz' 
end 

...或接受塊

define_method 'fizz', &block 
相關問題