2016-12-27 84 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(...)