2010-01-11 3 views
0

남자, 오늘 양파의 층을 박리하고있어 수율은, 어쨌든 여기루비 class_eval 및

class MyClass 
    def initialize(dynamic_methods) 
    @arr = Array.new(dynamic_methods) 
    @arr.each { |m| 
     self.class.class_eval do 
     define_method(m) do 
      "<#{yield self if block_given?}>" 
     end 
     end 
    } 
    end 
end 

tmp = MyClass.new ['method1', 'method2', 'method3'] 
tmp.method1 do |t| 
    "here" 
end 

내 문제는 내가 define_method (m) 내에서 "여기"에 접근을 시도하고 있다는 것입니다 코드 때 메소드가 작성 될 때 실행되는 것이 아닙니다. 현재의 문장 "< # {block_given 인 경우 자기를 양보 하시겠습니까?}>"나에게 그렇게주지 않습니다. 그리고 궁금한 점이있는 경우이 코드를 그대로 유지해야하지만 MyClass에 대한 모든 변경 작업을 수행 할 수 있습니다.

tmp = MyClass.new ['method1', 'method2', 'method3'] 
tmp.method1 do |t| 
    "here" 
end 

누구나 구문을 사용할 수 있습니까? 귀하의 도움에 미리 감사드립니다.

업데이트 : 내 대답은 아래를 참조하십시오.

답변

1

시도로

define_method(m) do 
    "<#{yield self if block_given?}>" 
end 

교체 :

define_method(m) do |&block| 
    "<#{block.call if block}>" 
end 

이것은 1.8.7 최대 작동한다. 또한 module_eval 사용하려고 할 수 있습니다 : 세르게이에서 많은 피드백으로

self.class.module_eval %Q{ 
    def #{m}(&block) 
    "<\#{block.call if block}>" 
    end 
} 
+0

1.8.7에서 작동하지만 이전 버전에서는 작동하지 않을 수 있습니다. – mxgrn

+0

슬프게도 당신이 옳다. 나는 1.8.6에있다. & 블록에 (구문 오류) barfed가있다. 즉 {DEF # {m} (블록) "<# {block.call 블록} 경우>" 단부} – Bob

+0

또한 오류가 발생했습니다. 이번에는 "정의되지 않은 지역 변수 또는 메소드'block '"이 발생합니다. – mxgrn

0

을 일부 내 자신에 땜질, 당신이 말할 수는

class MyClass 
    def initialize(dynamic_methods) 
    @arr = Array.new(dynamic_methods) 
    @arr.each { |m| 
     self.class.module_eval %Q{ 
     def #{m}(&block) 
      yield(self) if block_given? 
     end 
     end 
    } 
    end 
end 

tmp = MyClass.new ['method1', 'method2', 'method3'] 
tmp.method1 do |t| 
    "here" 
end 

작업 얻을 관리, 몇 가지가 있습니다 세르게이의 제안에 약간의 비틀기가있어서 세르게이에게 도움을 주셔서 감사합니다.