使用名称空间/模块的Ruby

使用名称空间/模块的Ruby,ruby,class,module,namespaces,net-http,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的正确方法是什么?i、

例如:

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
的正确方法是什么?i、 e.
HTTP::Get.new()
或只是
Get.new()

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

Net::HTTP.start(...)

include Net
# HTTP.start(...)
当您积极导入时要小心,因为如果您得意忘形,可能会导致类内冲突

另一种方法是创建别名:

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

“正确”的方法是把它说清楚,不要太慌乱。一个典型的Ruby程序会将这种低级行为隐藏在抽象层之下,所以这很少是什么大不了的事。

我希望这个例子能澄清问题

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
确保您知道在使用导入或扩展时正在执行的操作。您可能最终会覆盖一个您可能不想覆盖的方法

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

在您的类中。

我不能
包含Net::HTTP
,它会抛出错误:
TypeError:错误的参数类型类(预期的模块)
啊,那么我应该删除它<代码>包含只在模块上起作用,但仅仅通过查看用例很难判断这些东西是如何构造的。别名可能更有效。在任何情况下,键入
Net::HTTP
都能让你清楚地知道你在做什么,而隐藏这通常是一个坏主意。@sawa不要删除标记
Net HTTP
。这是以后在
上搜索时需要的。