2013-07-25 54 views
2

這是bar.rb從模塊的上下文中加載一個Ruby文件?

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

回答

2

想通了,答案是使用eval

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

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

與本地綁定只加載該文件作爲一個字符串的評估到位。