2013-06-25 3 views
13

:루비 사용하여 네임 스페이스/모듈 예를 들어

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을 제거 할 수있는 rubist/올바른 방법은 무엇입니까? 즉 HTTP::Get.new()하거나 Get.new()

+0

@sawa는 'net-http'태그를 제거하지 않습니다. 'SO'에 대한 향후 검색에 필요합니다. –

답변

14

당신이이 단축하려는 경우, 당신은 그냥 네임 스페이스를 가져올 수 있습니다 : 당신이 흥분하면 그것은 당신의 클래스 내에서 충돌이 발생할 수 있습니다 적극적으로 가져올 때

Net::HTTP.start(...) 

include Net 
# HTTP.start(...) 

하는 것은주의해야합니다.

대안은 별칭을 만드는 것입니다 :

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

은 "올바른"방법은 그냥 밖으로 철자하고에 의해 너무 당황하지하는 것입니다. 일반적인 Ruby 프로그램은 추상 레이어 아래에 이런 종류의 로우 레벨 동작을 묻을 것이므로 거의 별다른 문제가 아닙니다.

+0

'Net :: HTTP'를 포함 할 수 없으므로 오류가 발생합니다.'TypeError : 잘못된 인수 유형 클래스 (예상 모듈) ' – w00d

+2

아, 그 때 제거해야합니다. 'include'는 모듈에서만 작동 합니다만, 유스 케이스를 살펴봄으로써 이러한 것들이 어떻게 구성되어 있는지 말할 수는 없습니다. 별칭이 더 잘 작동 할 수 있습니다. 어쨌든'Net :: HTTP'를 타이핑하는 것은 당신이하고있는 일을 풍부하게 해명하는 것이고, 숨기는 것은 보통 나쁜 생각입니다. – tadman

4

이 예제가 사물을 명확히 밝히기를 바랍니다.

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 

가져 오기 또는 확장을 사용할 때 수행중인 작업을 알고 있는지 확인하십시오. 재정의하고 싶지 않을 수도있는 메소드를 재정의 할 수도 있습니다.

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