Подтвердить что ты не робот

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()

4b9b3361

Ответ 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

в вашем классе.