Ruby using namespace/module
15,166
Solution 1
If you want to shorten these, you can just import that namespace:
Net::HTTP.start(...)
include Net
# HTTP.start(...)
Be careful when you import aggressively as it might cause conflict within your class if you get carried away.
An alternative is to create aliases:
HTTP = Net::HTTP
Get = Net::HTTP::Get
The "correct" way is to just spell it out and not get too flustered by that. A typical Ruby program will bury this sort of low-level behavior beneath an abstraction layer so it's rarely a big deal.
Solution 2
I hope this example will clarify things.
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
Make sure you know what you are doing when you use import or extend. You could end up overriding a method that you might not want to override.
Solution 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
in your class.
Comments
-
w00d almost 2 years
For example:
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
What is the correct/rubist way to get rid of
Net::HTTP
? i.e.HTTP::Get.new()
or justGet.new()
-
w00d almost 11 yearsI can't
include Net::HTTP
, it throws error:TypeError: wrong argument type Class (expected Module)
-
tadman almost 11 yearsAh, I should remove that then.
include
only works on modules, but it's hard to tell how these things are structured by just looking at use cases. Aliases might work better. In any case, typingNet::HTTP
is something that makes it abundantly clear what you're doing, and hiding that is usually a bad idea.