2012-07-03 18 views
8

मैं मूल वर्ग की कक्षा विधि के माध्यम से गतिशील रूप से बाल वर्ग की उदाहरण विधि बनाना चाहता हूं।रूबी गतिशील रूप से उदाहरण विधि को कैसे परिभाषित करें?

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

लगभग मैं क्या जरूरत है। समस्या यह है - और ब्लॉक का स्वयं बार का उदाहरण होना चाहिए। तो ऐसा कुछ लिखना संभव होगा: कक्षा बार; add_fizz_method करें; पी self.bar_name; समाप्त ; अंत –

+0

'p' के नीचे 'p self.class'' को आज़माएं, मुझे कछुए पसंद हैं। 'स्वयं' पहले से ही 'बार' का एक उदाहरण है। –

+0

बीटीडब्ल्यू: यदि आप 'add_fizz_method' कहने से पहले' NoMethodError' फेंकने के बजाय 'nil' वापस करना चाहते हैं, तो आप 'Foo' क्लास में खाली' Fizz' विधि घोषित कर सकते हैं। –

7
define_method 'fizz' do 
    puts 'fizz' 
end 

... या एक ब्लॉक

define_method 'fizz', &block 
संबंधित मुद्दे