【发布时间】:2012-11-23 13:03:33
【问题描述】:
我有一个名称和值列表,我正在尝试读取并转换为类,因此我使用的是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 和其他的各种组合,但到了只能猜测和检查的地步。我想我还没有完全理解元编程:-/
【问题讨论】:
-
你能提供一些你为什么要这样做的背景吗?也许还有另一种方式。我喜欢元编程(我正在使用 Smalltalk),但动态生成类(我尝试过)很少是最佳解决方案。
-
@ewernli 我有一个有效名称:值对的简短列表。我为它们创建了一个类,并保留了通过读取文件生成的所有有效实例的列表。我不希望创建任意实例,因此在该列表上有一个查找方法而不是初始化程序。我正要创建另一个类,它将封装第一个类的“实例”,存储对它的引用和一些额外的数据。基于这个命名,我意识到制作类并拥有它们的实际实例可能会更好。我认为它很好地模拟了领域,但没有考虑性能。
标签: ruby metaprogramming