оптимальный метод привязки карт эликсира - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть следующий код:

    total_pages = res["payload"]["total pages"]
    current_page = res["payload"]["page"]
    total_entities = res["payload"]["total entities"]
    queryId = res["payload"]["queryId"]
    unprocessed_entities = res["payload"]["entities"]

, где res - карта ответов http. Как Elixir связывает эти значения?

Ответы [ 2 ]

4 голосов
/ 01 ноября 2019

Вы можете напрямую сопоставить паттерн со всем, что вам нужно:

%{
    "payload" => %{
        "total pages" => total_pages,
        "page" => current_page,
        "total entities" => total_entities,
        "queryId" => queryId,
        "entities" => unprocessed_entities
    }
} = res
3 голосов
/ 01 ноября 2019

Если вы хотите убедиться, что ответная полезная нагрузка имеет все эти ключи и обрабатывать сбой по-другому, вы можете использовать функцию с разными предложениями:

defp local_vars(
  %{
    "total pages" => tp,
    "page" => cp,
    "total entities" => te,
    "queryId" => qid,
    "entities" => ue
   }), do: {:ok, {tp, cp, te, qid, ue}}
defp local_vars(_), do: {:error, :bad_payload}

и вызывать ее из своего кода следующим образом

case local_vars(res["payload"]) do
  {:ok, {total_pages, current_page,
         total_entities, query_id,
         unprocessed_entities}} ->
     # here you have all the local variables bound
  {:error, reason} -> IO.puts("Failed with reason #{reason}")
end

Или просто выполните всю работу внутри успешного предложения, тогда вам не понадобится case.

...