2013-06-25 42 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 

在你的课堂上。