2

我正在尝试设置一些 Ruby 代码,以便我可以动态定义一个新类。我现在的代码如下所示,我认为它可以工作,但它不起作用,我有点困惑为什么不工作。

def define_new_class(&block)
  new_class = Class.new(MyClass) do
    yield
  end
end

define_new_class do
  attr_accessor :my_accessor_1

  def initialize
    puts "Hello"
  end
end

任何见解将不胜感激!

4

1 回答 1

3

你很接近,但有一些事情发生了。首先Class.new定义新类的超类的参数,但MyClass没有定义。其次,您实际上想要在您定义的类的上下文中评估该块,而不是仅仅屈服于该块 - 因此instance_eval

def define_new_class(&block)
  new_class = Class.new do
    self.instance_eval &block
  end
end

a = define_new_class do
  attr_accessor :my_accessor_1

  def initialize
    puts "Hello"
  end
end

我的猜测是,您MyClass首先拥有的原因是您希望生成的类可以引用,因为MyClass如果是这种情况,您可以执行类似的操作

Object.const_set('MyClass', a)

所以在一个很大的快乐方法中:

def define_new_class(name, &block)
  new_class = Class.new do
    self.instance_eval &block
  end
  Object.const_set(name, new_class)
end

define_new_class('MyClass') do
  attr_accessor :my_accessor_1

  def initialize
    puts "Hello"
  end
end

a = MyClass.new #=> #<MyClass:0x007f8baaaf72c8>
a.my_accessor_1 = 1 #=> 1
a.my_accessor_1 # => 1
于 2013-11-05T00:46:31.730 回答