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

标签 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, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block
        Document.parse(thing, url, encoding, options, &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

首先,他们在名为 HTMLNokogiri 模块中定义了一个类方法(是的,Ruby 允许您这样做),然后他们定义了模块 Nokogiri::HTML 并在其中定义类方法 parse

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

"my_string"::size #will print 9

关于Ruby 模块给定参数调用一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880780/

相关文章:

ruby-on-rails - 在 Rails 中,是否可以修复模型内部的模型验证错误?

ruby - 是否有 Hash.Merge 的 ActiveRecord 版本?

mysql - 当您请求数组时,Ruby 的 dbi select_all 会给出有趣的结果

ruby-on-rails - 尝试使用 Rails 和 PostgreSQL 生成模型时,命令挂起且没有错误

mysql - 获取带有 EST 时区时间的游戏

ruby - 检查变量是否在 SASS 中定义

ruby - 猴子补丁类方​​法

ruby - 当我用 Ruby 解析 YAML 时,它改变了我的 anchor 名称

ruby - 有什么方法可以告诉 sidekiq 一项工作依赖于另一项工作

ruby - 如何使用 Doxygen 记录 Ruby 代码?