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

pkb*_*ron 1 elixir

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

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

我是否应该有一个经验法则来确定何时使用其中一种而不是另一种,反之亦然?

问候

Dog*_*ert 5

区别在于返回值:

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})
Run Code Online (Sandbox Code Playgroud)

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

fetch可以轻松地通过模式匹配来处理键不存在的情况,而fetch!当您期望键存在于映射中并且键不存在很可能是代码中的错误时,您通常会想要使用。