加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:13:37 所属栏目:百科 来源:网络整理
导读:我对Nokogiri文档中发生的事情感到困惑. 据我所知,如果 require 'nokogiri'some_html = "htmlbodyh1Mr. Belvedere Fan Club/h1/body/html" 然后这三行做同样的事情: html_doc = Nokogiri::HTML::Document.parse(some_html)html_doc = Nokogiri::HTML.parse(
我对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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读