Map.fetch(key,value)和Map.fetch有什么区别!(key,value)

时间:2018-04-18 00:49:45

标签: elixir

https://hexdocs.pm/elixir/Map.html#fetch/2https://hexdocs.pm/elixir/Map.html#fetch!/2略有不同,但没有讨论什么是不同的。

该文档确实提到第一个是“由编译器内联”,后者是异常引发的。

是否有一个经验法则我应该在何时使用一个而不是另一个,反之亦然?

问候

1 个答案:

答案 0 :(得分:4)

不同之处在于返回值:

iex(1)> map = %{foo: 42}
%{foo: 42}
iex(2)> Map.fetch(map, :foo)
{:ok, 42}
iex(3)> Map.fetch(map, :bar)
:error
iex(4)> Map.fetch!(map, :foo)
42
iex(5)> Map.fetch!(map, :bar)
** (KeyError) key :bar not found in: %{foo: 42}
    (stdlib) :maps.get(:bar, %{foo: 42})
如果密钥存在,则

fetch会返回{:ok, value},否则会返回:errorfetch!只返回值,如果不存在则会引发错误。

fetch可以轻松处理模式匹配时不存在密钥的情况,而当您希望密钥存在于地图中时,您通常需要使用fetch!缺少它可能是你的代码中的一个错误。