我对Nokogiri文档中发生的事情感到困惑.
@H_404_2@据我所知,如果
require 'nokogiri' some_html = "<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>"@H_404_2@然后这三行做同样的事情:
html_doc = Nokogiri::HTML::Document.parse(some_html) html_doc = Nokogiri::HTML.parse(some_html) html_doc = Nokogiri::HTML(some_html)@H_404_2@第二个是第一个方便的方法.但对于我的非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@H_404_2@首先,他们在Nokogiri模块中定义一个名为HTML的类方法(是的,Ruby允许你这样做),然后他们定义模块Nokogiri :: HTML并在那里定义类方法解析. @H_404_2@大多数人都不知道,但::运算符也可用于执行方法调用:
"my_string"::size #will print 9