-1

有两个 ruby​​ 文件 ruby​​A 和 ruby​​B。rubyB 仅包含 2 个方法

#rubyB.rb
def foo1()
   p "foo1 from rubyB"
end 
def foo2()
   foo1()
end 

并且 ruby​​A 包含

#rubyA.rb
require_relative 'rubyB.rb'
def foo1()
   p "foo1 from rubyA"
end
foo2()

输出将是“来自 ruby​​A 的 foo1”。foo2 如何从他的文件而不是从另一个文件调用 foo1?

4

3 回答 3

2

你刚刚覆盖了它!在同一个“范围”中不能有 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
于 2013-09-22T16:02:27.823 回答
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
于 2013-09-22T16:06:16.670 回答
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.

在此处阅读更多内容,这是我在 google 上搜索“ruby 模块作为命名空间”时的第一个热门内容

于 2013-09-22T16:13:39.167 回答