Ruby条件类名

时间:2016-12-27 22:48:56

标签: ruby

我有这个片段,但我正在寻找一种方法来使这更像红宝石,干,等等。

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

3 个答案:

答案 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.SOCKSProxyNet::HTTP.Proxy是大写的方法,而不是类。

答案 1 :(得分:1)

SOCKSProxyProxyNet::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))