给定参数的Ruby模块调用一个方法?

我对Nokogiri文档中发生的事情感到困惑.

据我所知,如果

require 'nokogiri'
some_html = "<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>"

然后这三行做同样的事情:

html_doc = Nokogiri::HTML::Document.parse(some_html)
html_doc = Nokogiri::HTML.parse(some_html)
html_doc = Nokogiri::HTML(some_html)

第二个是第一个方便的方法.但对于我的非Ruby眼睛,第三个看起来像是将一个参数传递给一个模块,而不是一个方法.我意识到Ruby有构造函数,但我认为它们采用的形式是Class.new,而不是Module(args).这里发生了什么?

解决方法

它只是语法糖,看看Nokogiri :: HTML模块定义:
module Nokogiri
  class << self
    ###
    # Parse HTML.  Convenience method for Nokogiri::HTML::Document.parse
    def HTML thing,url = nil,encoding = nil,options = XML::ParSEOptions::DEFAULT_HTML,&block
      Nokogiri::HTML::Document.parse(thing,url,encoding,options,&block)
    end
  end

  module HTML
    class << self
      ###
      # Parse HTML.  Convenience method for Nokogiri::HTML::Document.parse
      def parse thing,&block
        Document.parse(thing,&block)
      end

      ####
      # Parse a fragment from +string+ in to a NodeSet.
      def fragment string,encoding = nil
        HTML::DocumentFragment.parse string,encoding
      end
    end

    # Instance of Nokogiri::HTML::EntityLookup
    NamedCharacters = EntityLookup.new
  end
end

首先,他们在Nokogiri模块中定义一个名为HTML的类方法(是的,Ruby允许你这样做),然后他们定义模块Nokogiri :: HTML并在那里定义类方法解析.

大多数人都不知道,但::运算符也可用于执行方法调用

"my_string"::size #will print 9

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...