两个不同Ruby文件中具有相同名称的模块

时间:2015-12-22 18:46:43

标签: ruby

我的"文件1"

C:\Ruby200\lib\ruby\gems\2.0.0\gems\page-object-0.9.2\lib\page-object.rb  

和我的目录

C:\Ruby200\lib\ruby\gems\2.0.0\gems\page-object-0.9.2\lib\page-object
由于页面对象gem安装,

位于我的硬盘上。

在"文件1"的内容中,在其他代码行中,我看到以下行:

require 'page-object/page_populator'

在同一个文件中,我看到:

module PageObject
  include PagePopulator

查看"文件2"

C:\Ruby200\lib\ruby\gems\2.0.0\gems\page-object-0.9.2\lib\page-object\page_populator.rb

这些行位于此文件的顶部:

module PageObject
  module PagePopulator

根据我阅读的Ruby教程,说明在要求"文件2"进入"文件1"使用require,来自"文件2和#34;的模块需要被包含在"文件1"与include

我希望"文件1"

include PageObject::PagePopulator

而不是

include PagePopulator

但是,由于它没有以这种方式设置,并且page-object是一个广泛使用的gem,我相信在两个文件中都有PageObject模块消除了

的需要
include PageObject::PagePopulator

,因为

include PagePopulator

就足够了。

我想确认我的假设是正确的。

阅读了有关Module.nesting方法的内容,并阅读了googling"重新开放类/模块"返回的链接。查询,我仍然没有找到我的问题的答案。

我会再次尝试描述它。

file_a的内容如下:

require "file_b"
 module Foo
  include Bar
    ...
end

file_b的内容如下:

module Foo
 module Bar
   ...
end

我们不应该使用的解释在哪里 在file_a中如下:

include Foo::Bar 

而不是

include Bar

以及我之前写的方式:

include Bar

就足够了

如果我们有

会有什么不同

file_c,内容如下:

module Bar
    ...
end

这是否意味着从file_c到file_b包含模块没有区别?

file_a的内容与file_b中的模块和来自file_c的模块如下:

require "file_b"
 require "file_c"
  module Foo
   include Bar
     ...
  end

如果是这种情况,在file_b中有模块Foo是什么意思?

1 个答案:

答案 0 :(得分:0)

我认为你要问的是在ruby中进行常量查找的规则:当你在代码中编写Bar时,ruby如何找到该常量的值?

事情所处的文件是无关紧要的,重要的是

module Foo
  ...
end

Bar的引用将尝试Foo::Bar,然后是顶级::Bar常量(常量范围是词法范围的)

因此,如果先前已定义Foo::Bar,则

module Foo
  include Foo::Bar
end 

并且

module Foo
  include Bar
end 

做同样的事情。

Module.nesting方法将显示此查找链。 Ruby还将搜索当前打开的类/模块的祖先。有一些陷阱/角落案例,但这些是基础知识。