2012-07-03 2 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

거의 내가 필요. 문제는 - & block's self는 Bar의 인스턴스 여야합니다. 그래서 다음과 같이 작성할 수 있습니다 : class Bar; add_fizz_method do; p self.bar_name; 끝; 끝 –

+0

'p '아래에'p self.class'를 시도해보십시오.'p ''나는 거북이를 좋아합니다. 'self'는 이미'Bar'의 인스턴스입니다. –

+0

Btw :'add_fizz_method'를 호출하기 전에'NoMethodError'를 던지는 대신에'nil'을 리턴하기 원한다면'Foo' 클래스에 빈'fizz' 메소드를 선언 할 수 있습니다. –

7
define_method 'fizz' do 
    puts 'fizz' 
end 

... 또는 블록과 같은

define_method 'fizz', &block 
관련 문제