我有这个片段,但我正在寻找一种方法来使这更像红宝石,干,等等。
if proxy_uri.scheme =~ /^socks/
Net::HTTP.SOCKSProxy(proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri))
else
Net::HTTP.Proxy(proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri))
end
答案 0 :(得分:2)
除了参数:
之外,DRY还不多params = [ proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri) ]
if proxy_uri.scheme =~ /\Asocks/
Net::HTTP.SOCKSProxy(*params)
else
Net::HTTP.Proxy(*params)
end
如果你想要花哨(未经测试):
params = [ proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri) ]
proxy_method = proxy_uri.scheme =~ /\Asocks/ ? :SOCKSProxy : :Proxy
proxy = Net::HTTP.method(proxy_method).call(params)
请注意,Net::HTTP.SOCKSProxy
和Net::HTTP.Proxy
是大写的方法,而不是类。
答案 1 :(得分:1)
SOCKSProxy
和Proxy
是Net::HTTP
模块上的函数名称。
这是使工厂函数看起来像构造函数的一个奇怪技巧。 Ruby强制类名以大写和变量开头,以小写开头,但方法可以自由使用,包括模块函数。另请参阅Array
class vs global Array
函数(在Kernel
上定义为模块函数,该函数包含在Object
中,因此成为一个始终可用的私有方法。 / p>
因此试试这个,
Net::HTTP.method(proxy_uri.scheme =~ /^socks/ ? :SOCKSProxy, :Proxy).call(...)
答案 2 :(得分:-1)
你可以做到
proxy_uri.scheme =~ /^socks/ ? Net::HTTP.SOCKSProxy(proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri)) : Net::HTTP.Proxy(proxy_uri.host, proxy_uri.port, http_proxy_user(proxy_uri), http_proxy_pass(proxy_uri))