Ruby使用命名空间/模块

w00*_*00d 13 ruby namespaces module class 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
Run Code Online (Sandbox Code Playgroud)

什么是正确/擦除方式摆脱Net::HTTP?即HTTP::Get.new()或只是Get.new()

tad*_*man 17

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

Net::HTTP.start(...)

include Net
# HTTP.start(...)
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是创建别名:

HTTP = Net::HTTP
Get = Net::HTTP::Get
Run Code Online (Sandbox Code Playgroud)

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

  • 啊,我应该删除它.`include`仅适用于模块,但很难通过查看用例来说明这些内容是如何构建的.别名可能会更好.在任何情况下,输入"Net :: HTTP"都可以清楚地表明你正在做什么,而隐藏这通常是一个坏主意. (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

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