通过在Elixir中将其转换为小写来更新地图条目

时间:2017-03-10 03:33:06

标签: elixir

如何通过将键的值作为初始值来更新Map中的值?也就是说,我想将字符串值转换为小写,如下所示:

Map.update(m1, "key1", ???, &String.downcase/1)

“???”应该是什么因为它需要初始值?

2 个答案:

答案 0 :(得分:2)

由于仅在密钥不存在时才使用该初始值,因此您可以将nil作为默认值传递,如下所示:

Map.update(m1, "key1", nil, &String.downcase/1)

答案 1 :(得分:0)

如果您需要在地图中没有此类值的情况下优雅地退回代码,请使用Map.get_and_update/3

Map.get_and_update(m1, "key1", fn 
  current_value when is_binary(current_value) ->
    {current_value, String.downcase(current_value) }
  _ ->
    {current_value, "Conversion error: not a string" }
    # or raise
    # or {current_value, current_value}
end)

这样你就永远不会在某些输入上找到应用程序意外崩溃的原因。

如果你仍然想要走最简单的路径,那么传递一个空字符串而不是nil会更安全:

Map.update(m1, "key1", "", &String.downcase/1)

后者不会至少抛出,它会默默地在未知键上返回一个空字符串。