给定参数的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,&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
原文链接:https://www.f2er.com/ruby/270377.html

猜你在找的Ruby相关文章