2011-07-30 4 views
8

estoy confundido acerca de lo que está pasando en la documentación Nokogiri.El módulo de Ruby dado argumentos llama a un método?

Por lo que yo puedo decir, si

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

entonces estas tres líneas hacen lo mismo:

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

El segundo es sólo un método de conveniencia para el primero. Pero a mis ojos no Rubí, la tercera parece que está pasando un argumento a un módulo , no un método. Me doy cuenta de que Ruby tiene constructores, pero pensé que tomaron la forma Class.new, no Module (args). ¿Que está pasando aqui?

+0

pregunta interesante por cierto –

Respuesta

8

Es sólo el azúcar sintaxis, mira el módulo Nokogiri :: HTML definición:

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 

En primer lugar, se define un método de clase en el módulo Nokogiri llamada HTML (sí, Ruby permite que hagas eso), entonces ellos definen el módulo Nokogiri :: HTML y de allí que definen el método de clase analizar.

La mayoría de la gente no sabe pero el operador :: también se pueden utilizar para realizar llamadas de método:

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

1 para la información :: – macarthy

+0

Para llamadas a métodos, no hay, pero ** debes ** utilizar ** :: ** al intentar acceder a las constantes, como ** Nokogiri :: HTML :: Document **. –

+0

Lo siento, borré mi pregunta en los comentarios. Pregunté si había una diferencia entre. y ::. Gracias Mauricio! – bsamek

Cuestiones relacionadas