Ruby с использованием пространства имен/модуля
Например:
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()
Ответы
Ответ 1
Если вы хотите сократить их, вы можете просто импортировать это пространство имен:
Net::HTTP.start(...)
include Net
# HTTP.start(...)
Будьте осторожны, когда вы импортируете агрессивно, так как это может вызвать конфликт в вашем классе, если вы увлечены.
Альтернативой является создание псевдонимов:
HTTP = Net::HTTP
Get = Net::HTTP::Get
"Правильный" способ состоит в том, чтобы просто изложить его и не слишком волноваться этим. Типичная программа Ruby похоронит такого рода поведение на низком уровне под слоем абстракции, поэтому редко бывает очень сложно.
Ответ 2
Надеюсь, что этот пример прояснит ситуацию.
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
Убедитесь, что вы знаете, что делаете, когда используете импорт или расширяете. Вы можете в конечном итоге переопределить метод, который вы, возможно, не захотите переопределить.
Ответ 3
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
в вашем классе.