【发布时间】:2013-01-16 17:23:02
【问题描述】:
所以我遇到了这种情况,我想以编程方式定义一堆类。我在下面使用的方法工作正常,除了我从这里继承的第 3 方类不喜欢该类是匿名定义的事实(基本上,它没有它需要的信息,即. 'inherited' 钩子中的类名,在我有机会将匿名类设置为常量之前)。
['one', 'two', 'three'].each do |model|
cls = Class.new(ThirdPartyClass) do
define_method :model do
model
end
end
ThirdPartyClass.const_set(model.capitalize, cls)
end
我可以简单地使用 eval 并定义类,如下所示:
['one', 'two', 'three'].each do |model|
eval "class ThirdPartyClass::#{model.capitalize} < ThirdPartyClass; ...; end"
end
但我不喜欢它,因为它是杂乱的字符串插值。从美学上讲,基于块的方法看起来“更好”。
有什么方法可以使用基于块的语法非匿名地定义该类(即从一开始就使用名称),还是我注定要留在 eval 混乱的字符串输入领域?
【问题讨论】:
-
奇怪的是,你希望一个类在同一个类的名称空间内并且是同一个类的子类。
-
没错,但是命名空间的事情与这个特定的问题是正交的(至少我是这么认为的)。如果您好奇,我使用的是 classy_enum gem,按照该 gem 的约定,枚举值必须位于主枚举类的命名空间内。它产生的枚举语法有点类似于其他语言中的语法。
标签: ruby metaprogramming