长生不老药尝试营救

时间:2019-02-01 14:17:51

标签: elixir phoenix-framework

我不确定如何做到最好:

我有一个查找IP并返回其来源国家的函数。

country = Geolix.lookup(remote_ip).country.registered_country.name

有时会失败,在这种情况下,没有定义任何阵列键。

在其他语言中,我可能会做类似的事情:

try do
  country = Geolix.lookup(remote_ip).country.registered_country.name
rescue
  country = nil
end

我真的在努力正确使用语法。这也不是很“干净”。有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

如果case ... do的结果具有所需的所有键,则也可以将case与模式匹配一​​起使用,它与第一个键匹配,在第一个键中提取名称,如果不是,则表示您所需要的任何键从Geolix.lookup/1获得的值不符合您想要的模式,您返回nil

country = 
       case Geolix.lookup(remote_ip) do
          %{country: %{registered_country: %{name: name}}} -> name
          _ -> nil
       end

答案 1 :(得分:1)

您不需要使用try宏来执行此操作。它并非旨在控制流量。

我建议使用 Kernel.SpecialForms.with/1

country =
  with %{country: country} <- Geolix.lookup(remote_ip),
       %{registered_country: rc} <- country,
       %{name: name} <- rc, do: name

Kernel.get_in/2 也可能有效:

get_in Geolix.lookup(remote_ip), ~w[country registered_country name]a

FWIW,这是正确的 Kernel.SpecialForms.try/1 语法:

country =
  try do
    Geolix.lookup(remote_ip).country.registered_country.name
  rescue
    _ -> nil
  end

@ m3字符提供的答案也很好。