有两个ruby文件rubyA和rubyB。 rubyB只包含2种方法
#rubyB.rb
def foo1()
p "foo1 from rubyB"
end
def foo2()
foo1()
end
和rubyA包含
#rubyA.rb
require_relative 'rubyB.rb'
def foo1()
p "foo1 from rubyA"
end
foo2()
输出将是“来自rubyA的foo1”。 foo2如何从他的文件中调用foo1而不是从另一个调用foo1?
答案 0 :(得分:2)
您可能希望使用类或模块来确定方法的范围。
此外,require_relative的行为几乎就像在您需要的地方拥有所需文件中的所有代码一样。所以它与拥有这个文件基本相同。
# require_relative 'rubyB.rb'
def foo1
p "foo1 from rubyB"
end
def foo2
foo1
end
def foo1
p "foo1 from rubyA"
end
foo2
答案 1 :(得分:1)
#rubyB.rb
class B
def self.foo1
p "foo from B"
end
def self.foo2
foo1
end
end
#rubyA.rb
class A
def self.foo1
p "foo from A"
end
def self.foo2
foo1
end
end
#mycode.rb
require_relative 'rubyA'
require_relative 'rubyB'
B.foo2
答案 2 :(得分:1)
这两个文件都在全局命名空间中工作。您可以修改这两个文件以使用模块来指定命名空间
# rubyB.rb
module RubyB
def self.foo1
p "foo1 from rubyB"
end
def self.foo2
foo1
end
end
# rubyA.rb
require_relative 'rubyB'
module RubyA
def self.foo1
p "foo1 from rubyA"
end
end
RubyB.foo2
自我。在方法将其定义为模块方法之前,可以在模块命名空间内调用。 (正如我们在最后一行所做的那样,使用RubyB.foo2
。当调用RubyB.foo2时,控制跳转到RubyB模块,其中已包含RubyB名称空间。因此调用foo1
,自动调用RubyB.foo1
。
阅读更多here,这是我搜索'ruby模块作为命名空间'时的第一个点击之一