如何在对象上下文中加载文件

时间:2014-11-22 12:11:15

标签: ruby ruby-1.9.3

我正在玩一些元编程概念,并想知道我想做的事情是否可能。

事件有简单的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中尝试,但更改版本不是问题,因为它只是运动)

1 个答案:

答案 0 :(得分:3)

instance_eval可以使用String作为其参数而不是块,因此,而不是load(如您所建议将文件加载到顶层),您需要阅读将文件内容转换为要传入的字符串,如:

env.instance_eval(File.read(file))