2013-06-25 19 views
13

Na przykład:Ruby przy użyciu nazw/moduł

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 

Jaka jest prawidłowa/rubist sposób pozbyć Net::HTTP? tj HTTP::Get.new() lub po prostu Get.new()

+0

@sawa nie usuwaj znacznika 'net-http'. Jest on potrzebny do przyszłego wyszukiwania w' SO'. –

Odpowiedz

14

Jeśli chcesz skrócić je, można po prostu zaimportować przestrzeń nazw:

Net::HTTP.start(...) 

include Net 
# HTTP.start(...) 

być ostrożnym podczas importowania agresywnie, ponieważ może to spowodować konflikt wewnątrz swojej klasie, jeśli dać się ponieść.

Alternatywą jest tworzenie aliasów:

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

„poprawny” sposób, to po prostu oznaczać go i nie dostać zbyt speszony przez to. Typowy program Ruby zakopuje ten rodzaj niskiego poziomu pod warstwą abstrakcji, więc rzadko jest to wielka sprawa.

+0

Nie mogę 'include Net :: HTTP', to powoduje błąd:' TypeError: niepoprawny typ argumentu Class (expected Module) ' – w00d

+2

Ah, powinienem to wtedy usunąć. "include" działa tylko na modułach, ale trudno jest określić, w jaki sposób są one uporządkowane, patrząc tylko na przypadki użycia. Aliasy mogą działać lepiej. W każdym razie wpisanie 'Net :: HTTP' jest czymś, co sprawia, że ​​jest jasne, co robisz, a ukrywanie to zwykle zły pomysł. – tadman

4

Mam nadzieję, że ten przykład wyjaśni sprawy.

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 

Upewnij się, że wiesz, co robisz podczas importowania lub rozszerzania. Możesz w końcu nadpisać metodę, której możesz nie chcieć nadpisać.

1
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 

w twojej klasie.

Powiązane problemy