https://hexdocs.pm/elixir/Map.html#fetch/2和https://hexdocs.pm/elixir/Map.html#fetch!/2略有不同,但没有讨论什么是不同的。
该文档确实提到第一个是“由编译器内联”,后者是异常引发的。
是否有一个经验法则我应该在何时使用一个而不是另一个,反之亦然?
问候
答案 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}
,否则会返回:error
。 fetch!
只返回值,如果不存在则会引发错误。
fetch
可以轻松处理模式匹配时不存在密钥的情况,而当您希望密钥存在于地图中时,您通常需要使用fetch!
缺少它可能是你的代码中的一个错误。