2

这是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

4

1 回答 1

2

想通了,答案是使用eval

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

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

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

于 2013-07-25T20:36:55.063 回答