Создание динамического класса, проблема с определением функции внутри блока: тело функции не видит локальную область видимости - PullRequest
1 голос
/ 10 сентября 2011

Я пишу функцию для динамического создания классов.Я столкнулся с проблемой с переменной * 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?

1 Ответ

0 голосов
/ 11 сентября 2011

Я не уверен, что вы пытаетесь достичь с помощью этого устройства, но после некоторых изменений оно работает (ну, в зависимости от вашего определения «работать»):

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)

Уловка, чтобы сделать vars видимым, состоит в том, чтобы определить конструктор, используя замыкание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...