我不确定如何做到最好:
我有一个查找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
我真的在努力正确使用语法。这也不是很“干净”。有更好的方法吗?
答案 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字符提供的答案也很好。