是否有任何原生的 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)
没有一个。
但您可以编写自己的包装方法来执行此操作:
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. 如果你想自己实现,可以在这里获取代码。