2011-10-15 107 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 
相關問題