【问题标题】:Elixir try rescue灵药尝试救援
【发布时间】:2019-02-01 22:32:08
【问题描述】:

我不确定如何最好地做到这一点:

我有一个函数可以查找 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

我真的很难让语法正确。这也感觉不是很“干净”;有没有更好的办法?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    您也可以将case ... do 与模式匹配一​​起使用,如果case 的结果包含您需要的所有键,则它与您提取名称的第一个匹配,如果不是,则表示您从@987654323 获得的任何内容@ 不符合你想要的模式,你返回 nil

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

    【讨论】:

    • 我真的很喜欢。有趣的是,我想出了两个不同的答案,都不太明确。
    • @AlekseiMatiushkin 是的,我看到你的出现了,然后因为你没有展示这个决定写它 - 我发现 case w/ 模式匹配是我的最爱之一,因为正是明确它是(并且很容易成长/改变)!
    • 这变成了一个非常有趣的帖子。我认为这是我的首选方式,它最容易阅读
    • 感谢两位的贡献! :)
    【解决方案2】:

    您不能使用 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
    

    @m3characters 提供的答案也很好。

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多