如何在不在Ruby中定义Object的常量的情况下需要文件?

时间:2018-01-27 21:02:17

标签: ruby

我想在Ruby中需要一个文件而不在Object上定义该文件的常量。相反,我想将它们仅包含在需求文件中的模块中。例如,如果我有一个文件foo.rb,如下所示:

module Foo
  def self.hello_world
    puts 'Hello, World.'
  end
end

我希望实现的结果的表示看起来像这样:

module Bar
  require_relative './foo.rb'
end

Foo.hello_world
# NameError: uninitialized constant Foo

Bar::Foo.hello_world
# Hello, World.

似乎Ruby中需要的东西,在另一个文件的顶层定义的任何东西都将被定义为Object上的常量,因此全局可用。我遇到了问题,因为我需要一个与全局命名空间中的常量冲突的文件。

我认识到这个问题可能是Ruby的基础,但有可能有一些元编程技术来克服这个问题吗?

2 个答案:

答案 0 :(得分:1)

以下代码段似乎适用于我尝试做的事情:

module Bar
  class_eval File.open('./foo.rb').read
end

虽然我可能仍然遗漏了一些东西。

答案 1 :(得分:0)

如果您不需要访问祖先,那么您正在寻找的是extend

module Foo
  def hello_world
    puts 'Hello, World.'
  end
end

module Bar
  extend Foo 
end


Bar.hello_world