Эликсир попробуйте спасти - PullRequest
0 голосов
/ 01 февраля 2019

Я не уверен, как лучше это сделать:

У меня есть функция, которая ищет 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 голосов
/ 01 февраля 2019

Вы также можете использовать case ... do с сопоставлением с образцом, если результат case имеет все необходимые вам ключи, он соответствует первому, где вы извлекаете имя, если нет, это означает, что вы получили от Geolix.lookup/1 не соответствует шаблону, который вы хотите, и вы возвращаете ноль

country = 
       case Geolix.lookup(remote_ip) do
          %{country: %{registered_country: %{name: name}}} -> name
          _ -> nil
       end
0 голосов
/ 01 февраля 2019

Вы не делаете это с 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, также очень хорош.

...