需要一个可以从块生成其他类的类

时间:2011-10-15 17:37:59

标签: ruby

这个问题很难说,但这就是想法。我希望能够做到这样的事情:

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函数!

由于

1 个答案:

答案 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