从模块的上下文中加载Ruby文件?

时间:2013-07-25 19:59:39

标签: ruby module

这是 bar.rb

module Bar
end

现在,在 foo.rb 中,我希望将其作为Foo的子模块包含在内。我试过这个

module Foo
    load './bar.rb'
end

但这只是加载 bar.rb ,就好像它在全局命名空间中一样。使用上面的代码:

::Bar # => Bar
Foo::Bar # => NameError: uninitialized constant Foo::Bar

我正在寻找一种从模块上下文中加载文件的方法,以便切换上述结果 - Foo::Bar已定义,但不是::Bar。基本上,它的结果类似于代码是这样的:

module Foo
    module Bar
    end
end

::Bar # => NameError: uninitialized constant Bar
Foo::Bar # => Foo::Bar

这可能吗?我正在使用Ruby 1.9.3

1 个答案:

答案 0 :(得分:2)

想出来,答案是使用eval

module Foo
    eval IO.read('./bar.rb'), binding
end

::Bar # => NameError: uninitialized constant Bar
Foo::Bar # => Foo::Bar

只需将文件作为字符串加载,并使用本地绑定进行评估。