这个问题很难说,但这就是想法。我希望能够做到这样的事情:
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函数!
由于
答案 0 :(得分:4)
如果我正确理解了你的问题,你可以使用'Flat the the Scope'法术来完成这项任务,并重写你的代码:
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