2013-06-25 16 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 

です。

関連する問題