概述:
main.rb
items/
one.rb
two.rb
three.rb
每个文件都items/
应该有一个人类可读的描述(序列化已结束),就像这样(但也许 DSL 会更好?):
class One < BaseItem
name "Item one"
def meth
"something"
end
main.rb
应该能够实例化items/
目录中的所有对象。这怎么可能实现?不熟悉 Ruby,我看到对象模型允许一些非常酷的东西(那些类挂钩等),但我很难找到解决这个问题的方法。
任何输入方式表示赞赏。
编辑:
射击,我可能错过了它的要点 - 我没有提到items/
目录中的东西是动态的 - 将项目视为插件,我想main.rb
在运行时自动检测该目录中的所有内容(可能在期间强制重新加载执行)。main.rb
对那里的对象没有先验知识,它只知道可以从它们那里得到什么方法。
我已经研究过构建 DSL,考虑定义 (in main.rb
) 一个spawn
带块的函数。中的示例文件items/
如下所示:
spawn do
name "Item name"
def foo
"!"
end
end
并且内部spawn
将创建一个基本类型的新对象并将块传递给instance_eval
. 这意味着我需要有一个方法name
来设置值,但顺便说一句,我还希望在 下可以访问该值name
,所以我不得不绕过它重命名 attr。
我也尝试过继承路线:让每个项目文件都包含一个从 a 继承的类BaseItem
,并通过inherited
...挂钩它,但这没有用(挂钩从未触发,我现在丢失了代码)。
编辑2:
你可以看看自制软件对它的公式做了什么,这非常接近我想要的——我只是没有红宝石的能力来逆向工程它如何处理一个公式。