我想基于结构中某些值的存在来构建关键字列表。
目前我是这样的:
options = [timeout: @timeout, follow_redirect: true]
if proxy_conf.proxy_hostname do
options = options ++ [proxy: {proxy_conf.proxy_hostname, proxy_conf.proxy_port}]
if proxy_conf.proxy_username do
options ++ [proxy_auth: {proxy_conf.proxy_username, proxy_conf.proxy_password}]
else
options
end
end
在Elixir中,有没有更简单/更精细的方法?
答案 0 :(得分:2)
我会用不同的子句来做到这一点:
defp set_proxy(options, nil, _), do: options
defp set_proxy(options, _, nil), do: options
defp set_proxy(options, proxy_conf, _) do
options
|> Keyword.put(:proxy, {proxy_conf.proxy_hostname, proxy_conf.proxy_port})
|> set_auth(proxy_conf, proxy_conf.proxy_username)
end
defp set_auth(options, _, nil), do: options
defp set_auth(options, proxy_conf, _) do
options
|> Keyword.put(:proxy, {proxy_conf.proxy_username, proxy_conf.proxy_password})
end
并将其用作:
set_proxy(
[timeout: @timeout, follow_redirect: true],
proxy_conf,
proxy_conf.proxy_hostname
)
请注意,即使proxy_conf
为nil
,该代码也可以安全执行。