2016-12-27 3 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.SOCKSProxy и Net::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

Отредактировано. На смартфоне, я думаю, вы могли бы добавить новую строку в 4 пространства как отступ. –

1

SOCKSProxy и Proxy являются имена функций на Net::HTTP модуле.

Это то, что один странный трюк, чтобы фабричная функция выглядела как конструктор. Ruby применяет имена классов, чтобы начинать с верхнего регистра и переменной, чтобы начать с строчной буквы, но методы могут свободно использовать либо включая функции модуля. См. Также Array класс vs global Array функция (которая определена как функция модуля на Kernel, которая включена в Object и, таким образом, становится частным методом, который всегда доступен).

Таким образом, попробовать это,

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