建立关键字清单

时间:2018-08-17 09:15:33

标签: elixir

我想基于结构中某些值的存在来构建关键字列表。

目前我是这样的:

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中,有没有更简单/更精细的方法?

1 个答案:

答案 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_confnil,该代码也可以安全执行。