2011-07-30 17 views
8

Nokogiriのドキュメントで何が起こっているのか混乱しています。引数を指定したRubyモジュールはメソッドを呼び出しますか?

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

第二は、最初のためだけの便利なメソッドです:限り

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

は、これら3行は同じことを行う場合、私は、言うことができるように

。しかしRuby以外の私の目には、メソッドではなくモジュールに引数を渡すような3番目のコードがあります。私はRubyにコンストラクタがあることを認識していますが、Module(args)ではなくClass.newという形式を取ったと思います。何が起きてる?

+0

興味深い質問ところで –

答えて

8

それは鋸山:: 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 

まず、彼らはHTML(はい、Rubyができますと呼ばれる鋸山モジュールでクラスメソッドを定義しますあなたはそれを行うために)、彼らはモジュールNokogiri :: HTMLを定義し、クラスメソッドの解析を定義します。

ほとんどの人は知らないが、呼び出す::演算子は、メソッドを実行するために使用することができます。

"my_string"::size #will print 9 
+1

+1メソッド呼び出し、なしの場合::情報 – macarthy

+0

ため、 ** Nokogiri :: HTML :: Document **のような定数にアクセスしようとすると、** ** ** ** **を使用する必要があります。 –

+0

申し訳ありませんが、コメント内の私の質問を削除しました。私は違いがあるかどうか尋ねた。と::。ありがとうMauricio! – bsamek

関連する問題