2015-03-24 56 views
0

我最近有理由使用nokogiri gem來解析html,但是當我瀏覽他們的文檔時,我遇到了這種我以前沒見過的ruby語法語法MODULE :: METHODNAME('string')是如何工作的

html_doc = Nokogiri::HTML('<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>') 
xml_doc = Nokogiri::XML('<root><aliens><alien><name>Alf</name></alien></aliens></root>') 

我感興趣的部分是Nokogiri :: HTML('...')。這看起來非常像方法調用,但我知道ruby方法名稱不能用大寫字母。所以,我看遍了代碼文件引入nokogiri寶石和我碰到下面的定義

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 
# more code 
end 

我試圖複製相同的代碼

module How 
    class << self 
     def DOESTHISWORK 
     puts "In How Method" 
     end 
    end 
end 

How::DOESTHISWORK 

但它一直回來出現錯誤「未初始化的常量如何:: DOESTHISWORK (NameError)」。我知道它與首都開始的方法名稱有關,但我一直無法弄清它在nokogiri中的工作原理。

回答

3

區別在於Nokogiri示例中的方法正在用括號和一個將其標識爲方法調用的參數值進行調用。您的DOESTHISWORK方法不帶參數,但可以使用空括號來調用,例如

irb(main):028:0> How::DOESTHISWORK() 
In How Method 
=> nil 

如果您添加到您的方法的參數,它也可用於鑑定它作爲像這樣的方法:

irb(main):036:0> How::DOESTHISWORK 'some param' 

啓動方式的名稱以小寫字母是很好的做法,但ISN沒有執行。以大寫字母開頭的內容被認爲是一個常量,並且將被視爲一個常量,這就是爲什麼需要使用括號或參數來指示方法被引用的原因。又如:

irb(main):051:0> def Example 
irb(main):052:1> puts "An example!" 
irb(main):053:1> end 
=> nil 
irb(main):054:0> Example 
NameError: uninitialized constant Example 
    from (irb):54 
    from /Users/mike/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>' 
irb(main):055:0> Example() 
An example! 
=> nil 
+0

但如何走到這一步的作品,儘管ruby確保方法名稱以小寫字母或下劃線字符開頭? – Anwuna 2015-03-24 23:13:49

+0

@Anwuna我在答案中增加了一些細節:簡短版本:這是一個很好的習慣,但不是強制性的,用小寫字母開始方法名稱。 – mikej 2015-03-24 23:21:39

+1

謝謝。直到現在我還以爲口譯員實際上是在執行它。不知道這是更多的一個慣例。 – Anwuna 2015-03-24 23:26:04

0

我也發現這個職位是非常有益

What are the restrictions for method names in Ruby?

這是很好的做法,而不是強制性的,與 小寫字母開頭的方法名,因爲以大寫字母 開頭的名稱在Ruby中是常量。它仍然可以使用常量名 的方法,但你不能調用它沒有括號, 因爲interpeter將查找該名稱作爲常數

相關問題