Ruby使用命名空间/模块

时间:2013-06-25 14:17:41

标签: ruby class module namespaces net-http

例如:

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的正确/擦除方法是什么?即HTTP::Get.new()Get.new()

3 个答案:

答案 0 :(得分:17)

如果您想缩短它们,可以只导入该命名空间:

Net::HTTP.start(...)

include Net
# HTTP.start(...)

当你积极进口时要小心,因为如果你被带走,它可能会引起你班上的冲突。

另一种方法是创建别名:

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

“正确”的方法就是把它拼出来,不要太过于慌张。典型的Ruby程序会将这种低级行为隐藏在抽象层之下,因此它很少有大问题。

答案 1 :(得分:5)

我希望这个例子能澄清事情。

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

确保在使用导入或扩展时知道自己在做什么。您最终可能会覆盖一个您可能不想覆盖的方法。

答案 2 :(得分:2)

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

在你班上。