2016-12-27 75 views
-1

我有这样的片断,但是我正在寻找一种方法,使这更象红宝石,干燥等红宝石有条件的类名

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

这是什么片段吗?没有任何解释就很难理解。 –

+0

它来自返回'Net :: HTTP'实例的方法的一部分。类方法'Proxy'和'SOCKSProxy'(来自socksify gem)像Net:HTTP一样工作,但通过指定的代理服务器传递流量。 –

+0

这些不是类名,它们是方法调用。你可以很容易地看到这一点,因为它们带有参数,方法调用是Ruby允许接受参数的唯一东西。 –

回答

2

没有太多更干,除参数:

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是大写的方法,而不是类。

+0

谢谢,这是我正在寻找。 –

+2

你也可以使用'case proxy_uri.scheme'来做类似'when/\ Asocks /'的子句。使用'\ A'比'^'更可取,因为它锚定在字符串的开头,而不是行的开头,在某些情况下这可能是一个巨大的交易。你也应该可以使用'send',参数是':SOCKSProxy'或':Proxy'。 Net :: HTTP库非常古怪,它以各种不恰当的方式使用大写字母。 – tadman

-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)) 
+1

作为奖励,它更可读:) –

+0

我怎样才能让它看起来像代码?我在我的智能手机 –

+0

编辑。在智能手机上,我认为你可以添加一个换行符作为缩进。 –

1

SOCKSProxyProxyNet::HTTP模块的功能名称。

这是一个让工厂函数看起来像一个构造函数的奇怪技巧。 Ruby强制类名以大写字母开头,变量以小写字母开头,但方法可以自由使用,包括模块功能。另请参见Array class vs global Array函数(定义为Kernel的模块函数,其包含在Object中,因此成为始终可用的私有方法)。

因此试试这个,

Net::HTTP.method(proxy_uri.scheme =~ /^socks/ ? :SOCKSProxy, :Proxy).call(...)