Ruby 动态类创建,块内函数定义问题:函数体看不到局部范围

Ruby 动态类创建,块内函数定义问题:函数体看不到局部范围,ruby,class,dynamic,Ruby,Class,Dynamic,我正在编写一个函数来动态创建类。我遇到了*vars变量的问题(如下所示),在传递给Class::new的块中,“def initialize”方法无法看到*vars的值(因此Ruby报告了*vars上的未绑定变量错误) 怎么办 谢谢 class MyParentClass def do_something_with(*args) end def do_something_else_with(*vars) end end def create_class(clas

我正在编写一个函数来动态创建类。我遇到了*vars变量的问题(如下所示),在传递给Class::new的块中,“def initialize”方法无法看到*vars的值(因此Ruby报告了*vars上的未绑定变量错误)

怎么办

谢谢

class MyParentClass
    def do_something_with(*args)
    end
    def do_something_else_with(*vars)
    end
end

def create_class(class_name,*vars)

    new_class = Class::new(MyParentClass) do
            def initialize(*args)
                super
                do_something_with(args)
                do_something_else_with(vars)
            end
        end
    Object::const_set(class_name.intern,new_class)
end 

    # Ruby: Error: *vars is unbound variable
    # My notes: *vars is in scope inside the do..end block passed to Class::new, but cannot be seen inside def initialize (why?) . And, how to fix this?

我不知道你想用这个装置实现什么,但经过一些改变后,它工作了(好吧,取决于你对“工作”的定义):


使
vars
可见的诀窍是使用闭包定义构造函数。

您可以使用类vars对其进行破解以存储数据,然后在initialize函数中检索它。然而,我正在寻找一个更干净的解决方案(如果有的话?),我已经尝试过了,使用class_var hack可以很好地工作。使用类变量是有意义的,因为如果我要自己在代码中通过键入手动子类化MyParentClass,我将调用“do_something_else_with(vars)”,变量是我在代码中键入的静态字符串;我想手动将其输入源代码与动态地将其存储在类中是一样的——它必须存储在某个地方!哇,谢谢!这太棒了!我不知道define_方法和define_方法之间有什么区别。。。在这种情况下,您是否以某种方式过度编写了默认的初始化(使用def initialize定义)?我试图做的是:动态解析文本文件,根据我解析的内容创建类。它与硬件工程有关,而不是软件:)
class MyParentClass
  def do_something_with(*args)
    puts "something #{args.inspect}"
  end
  def do_something_else_with(*vars)
    puts "else #{vars.inspect}"
  end
end

def create_class(class_name,*vars)

  new_class = Class::new(MyParentClass) do
    define_method :initialize do |*args|
      super()
      do_something_with(*args)
      do_something_else_with(*vars)
    end
  end
  Object::const_set(class_name.intern,new_class)
end

create_class :MyClass, 1, :foo, :bar
MyClass.new(2, :baz)