2011-10-15 1 views
0

질문은 말하기 어렵지만 여기에 아이디어가 있습니다. 나는 다음과 같은 것을 할 수 있기를 바란다 :블록에서 다른 클래스를 생성 할 수있는 클래스가 필요합니다.

A=M.make {|x| x+1} 
B=M.make {|x,y| x+y} 
a=A.new 
b=B.new 
a.eval(1) #returns 2 
b.eval(1,2) #returns 3 

여기는 내가 지금까지 가지고있는 클래스이다.

class M 
    def self.make &blk 
    Class.new do 
     @@blk=blk 
     def eval *args 
     @@blk.call(*args) 
     end 
    end 
    end 
end 

위의 경우 수행 할 작업은 다음과 같습니다.

a.eval(1) #error 
a.eval(1,2) #3 
a.eval(1,2) #3 

분명히 이것이 범위 문제인 것처럼 보이지만 해결 방법을 모르는 것 같습니다. 이상적으로, M이 만든 클래스에서 인스턴스화 된 각 클래스에 대해 자체 범위를 가지고 물론 eval func를 작성하고 싶습니다.

감사

답변

4

내가 제대로 질문을 이해한다면, 당신은이 작업을 위해 주문 등 코드를 재 작성 '범위 편평'사용할 수 있습니다

class M 
    def self.make &blk 
    Class.new do 
     define_method :eval do |*args| 
     blk.call(*args) 
     end 
    end 
    end 
end 

A = M.make { |x| x + 1 } 
B = M.make { |x, y| x + y } 
a = A.new 
b = B.new 
puts a.eval 1  #=> 2 
puts b.eval 1, 2 #=> 3 
관련 문제