1

我有一个名称和值列表,我正在尝试读取并转换为类,因此我正在使用Class.new.

我想要的最终结果是许多类的工作方式就像定义一样:

module MyMod
  class AA < Base
    def self.value
      value1
    end
  end

  class AB < Base
    def self.value
      value2
    end
  end

  ...
end

我当前的代码如下所示:

name = 'AA'
value = 'test'
MyMod.const_set name, Class.new(Base) do
  ???
end

设置名称效果很好,但还没有弄清楚我在块中需要什么才能value进入。调用def不起作用,因为闭包value丢失了。

我设法让事情与:

temp = const_set name, Class.new(Base)
temp.define_singleton_method(:value) { value }

但是,似乎应该有一种方法可以使用Class.new. 另外,我真的不确定define_singleton_method是否将方法放在正确的位置。它在我的测试中有效,但我不确定该方法是否真的在我认为的位置或调用链上的其他位置。我尝试了class_variable_set, attr_reader, class_eval,instance_eval和其他的各种组合,但它到了只能猜测和检查的地步。我想我还没有完全理解元编程:-/

4

1 回答 1

4

如果我正确理解了您的问题,这应该对您有用:

class Base
end

class AA < Base

  name = :Blah
  klass = self.const_set name, Class.new(Base)

  class << klass
    def value
      __method__
    end
  end

end

p AA::Blah.value
#=> :value

更新:似乎您希望在块中定义它:

class Base
end

class AA < Base

  name = :Blah
  klass = Class.new(Base) do

    class << self
      def value
        __method__
      end
    end

  end
  self.const_set name, klass

end

p AA::Blah.value

你尝试这个:

const_set name, Class.new(Base) do
  ...
end

它不起作用,因为该块是指const_set而不是Class.new

如果您更define_singleton_method喜欢class << self

class Base
end

class AA < Base

  name = :Blah
  klass = Class.new(Base) do

    self.define_singleton_method :value do
      __method__
    end

  end
  self.const_set name, klass

end

最后,如果您真的想立即定义它们,请使用括号而不是do...end

class Base
end

class AA < Base

  name = :Blah
  self.const_set name, Class.new(Base) {

    self.define_singleton_method :value do
      __method__
    end

  }

end

是一个工作演示

于 2012-11-23T13:10:42.853 回答