使用其他文件中的方法

时间:2013-09-22 15:53:53

标签: ruby

有两个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?

3 个答案:

答案 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模块作为命名空间'时的第一个点击之一