2013-06-25 39 views
13

例如:紅寶石使用命名空間/模塊

require 'net/http' 
uri = URI('http://example.com/some_path?query=string') 

Net::HTTP.start(uri.host, uri.port) do |http| 
    request = Net::HTTP::Get.new uri 

    response = http.request request # Net::HTTPResponse object 
end 

什麼是擺脫Net::HTTP正確/ rubist方法是什麼?即HTTP::Get.new()或者只是Get.new()

+0

@sawa不會刪除標籤'net-http'.它是未來搜索'SO'所必需的。 –

回答

14

如果要縮短這些,你可以導入命名空間:

Net::HTTP.start(...) 

include Net 
# HTTP.start(...) 

要小心,當您導入積極,因爲它可能您的類中引起衝突,如果你得意忘形。

另一種方法是創建別名:

HTTP = Net::HTTP 
Get = Net::HTTP::Get 

「正確」的方法是隻拼出來,並沒有得到由太緊張。一個典型的Ruby程序將在抽象層之下埋葬這種低級行爲,所以它很少成爲一件大事。

+0

我不能'包含Net :: HTTP',它會拋出錯誤:'TypeError:錯誤的參數類型Class(expected Module)' – w00d

+2

啊,我應該刪除它。 'include'只適用於模塊,但很難通過查看用例來了解這些事情的結構。別名可能會更好。在任何情況下,輸入'Net :: HTTP'都可以讓你清楚你正在做什麼,並隱藏這通常是一個壞主意。 – tadman

4

我希望這個例子能夠澄清一些事情。

module Foo 
    def foo 
    "foo" 
    end 
end 

class Bar 
    include Foo 

    def bar 
    "bar" 
    end 
end 

Bar.new.foo # foo 
Bar.new.bar # bar 

class Baz 
    extend Foo 

    self.def baz 
    "baz" 
    end 
end 

Baz.foo # foo 
Baz.baz # baz 

確保您在使用導入或擴展時知道自己在做什麼。您最終可能會覆蓋您可能不想覆蓋的方法。

1
require 'net/http' 
uri = URI('http://example.com/some_path?query=string') 

httpns = Net::HTTP 

def get(uri) 
    httpns::Get.new uri 
end 

http.start(uri.host, uri.port) do |http| 
    request = get uri 

    response = http.request request # Net::HTTPResponse object 
end 

在你的課堂上。