开发者

Dynamic class creation, problem with function definition inside block: function body does not see local scope

I'm writing a function to dynamically create classes. I run into a problem with the *vars variable (below), where inside the block passed to Class::new, the "def initialize" method cannot see the value of *vars (and thus Ruby reports a unbound variable error on *vars).

What to do?

Thanks!

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(My开发者_运维技巧ParentClass) 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?


I am not sure what are you trying to achieve with this contraption, but after some changes it works (well, depending on your definition of "to work"):

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)

The trick to make vars visible is to define the constructor using a closure.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜