我正在玩一些元编程概念,并想知道我想做的事情是否可能。
事件有简单的DLS,
//test_events.rb
event 'monthly events are suspiciously high' do
true
end
并且当事件返回true时脚本应该喊出来,我尝试这样做而不用方法事件和任何实例变量来污染全局命名空间。所以我尝试这样的事情:
Dir.glob('*_events.rb').each do |file|
MyClass = Class.new do
define_method :event do |name, &block|
@events[name] = block
end
end
env = MyClass.new
env.instance_eval{@events = {}}
env.instance_eval{load(file)}
end
因此,对于每个* _events.rb文件,我想在MyClass的上下文中加载它(我知道Dir.glob的第二个循环#每个它会抱怨已定义的const - 现在不重要)。
问题在于test_events中的env.instance_eval{load(file)}
代码.rb是在Object上下文中运行的,因为我得到了
undefined method `event' for main:Object (NoMethodError)
有办法吗? (我现在在1.9.3中尝试,但更改版本不是问题,因为它只是运动)
答案 0 :(得分:3)
instance_eval
可以使用String
作为其参数而不是块,因此,而不是load
(如您所建议将文件加载到顶层),您需要阅读将文件内容转换为要传入的字符串,如:
env.instance_eval(File.read(file))