如何从映射中通过键获取值,无论键是字符串还是原子?

asi*_*niy 3 elixir

是否有任何原生的 Elixir 方法允许我从映射中通过键获取值,无论键是原子还是字符串?喜欢:

a = %{ k: 1 }
b = %{ "k" => 1 }

pure_elixir_method(a, :k) => 1 
pure_elixir_method(b, :k) => 1
Run Code Online (Sandbox Code Playgroud)

She*_*yar 5

没有一个。

但您可以编写自己的包装方法来执行此操作:

defmodule MyMap do
  def get(map, key) when is_atom(key) do
    Map.get(map, key) || Map.get(map, to_string(key))
  end
end
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

map = %{:a => 1, "b" => 2}

MyMap.get(map, :a)     # => 1
MyMap.get(map, :b)     # => 2
Run Code Online (Sandbox Code Playgroud)

1. 仅仅因为你可以,并不意味着你应该这样做。%{k: 1, "k" => 2}是一个很好的例子,说明为什么您不应该这样做(特别是对于您不了解的数据)。

2. 此方法仅适用于atom关键参数,您可以对其进行修改,使其同时接受原子和字符串参数:MyMap.get(map, "a") # => 1

3. 如果您确实喜欢使用原子获取映射值,请考虑在开始时对映射的键进行符号化。看看我的ExUtils.Map.symbolize_keys/2. 如果你想自己实现,可以在这里获取代码