子模块名称应该与方法名称冲突?

时间:2016-05-23 13:21:24

标签: ruby

我正在查看Nokogiri的源代码,并发现了这个:

module Nokogiri
  class << self
    def XML # some args
      # some code
    end
  end
  module XML
    # more code
  end
end

这些名字怎么不冲突?在使用Nokogiri::XML时,它如何知道我所指的是什么?这是最佳做法吗?如果是这样,这只是一种获取默认模块入口点的方法吗?

xml = Nokogiri::XML(open("www.foo.com/bar.xml"))

1 个答案:

答案 0 :(得分:2)

它们看起来非常相似:

module Noko
  class << self
    def XML # some args
      'method'
    end
  end
  module XML
  end
end
Noko::XML #access to a module
=> Noko::XML
Noko.XML # access to class method
=> "method"
Noko::XML() #access to a class method too
=> "method"

所以,我们可以说,没有任何参数,这个表达式就像一个模块,用params - 就像一个方法。

您可以在this SO question中看到有关Ruby中范围解析运算符的更多信息。