2012-07-03 22 views
8

Ebeveyn sınıfı sınıf yöntemiyle dinamik olarak örnek sınıfın örnek yöntemini oluşturmak istiyorum.Ruby'de örnek yöntemi dinamik olarak nasıl tanımlanır?

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" 

Satır 3'e ne yazmalı?

cevap

11

kullanım define_method kabul:

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 

çıkışı:

method undefined 
"i like turtles" 
+0

neredeyse ihtiyacım olanı. Sorun şu ki - & block's self Bar örneği olmalıdır. böylece böyle bir şey yazmak mümkün olurdu: class Bar; add_fizz_method yapmak; p self.bar_name; son ; –

+0

'un "p' i kaplumbağaları seviyorum" un altını deneyin. 'self' zaten' Bar'ın bir örneğidir. –

+0

Btw: 'add_fizz_method' denilmeden önce' NoMethodError'ı atmak yerine 'nil' döndürmek isterseniz 'Foo' sınıfında boş bir' fizz' yöntemini bildirebilirsiniz. –

7
define_method 'fizz' do 
    puts 'fizz' 
end 

... ya bir blok böyle

define_method 'fizz', &block 
İlgili konular