【问题标题】:How to Dict merge a map and a list with Map? (Dict is deprecated)如何用 Map 合并地图和列表? (不推荐使用字典)
【发布时间】:2018-03-04 12:43:37
【问题描述】:

所以在我的 phoenix 应用程序中我有这个警告:

警告:不推荐使用 Dict.merge/2,请使用 Map 模块进行工作 使用地图或关键字模块来处理关键字列表
测试/支持/test_helpers.ex:6

changes = Dict.merge(%{
  name: "Some User",
  username: "user#{Base.encode16(:crypto.strong_rand_bytes(8))}",
  password: "supersecret",
}, attrs)

当我将其更改为 Map.merge 时,它会崩溃,因为 attrs 不是地图,它需要地图:

 ** (BadMapError) expected a map, got: [username: "max"]
 stacktrace:
   (stdlib) :maps.merge(%{name: "Some User", password: "supersecret", username: "user19DA79B623406098"}, [username: "max"])

还有其他方法可以让它工作吗?还是我必须将 attrs 投射到地图中?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    您可以使用Enum.into/2 来合并两个 Enumerable。如果你想要一个关键字列表作为结果,关键字列表应该是第二个参数,如果你想要一个地图作为结果,地图应该是第二个参数。我猜你想要一个地图,这意味着你可以这样做:

    changes = Enum.into(attrs, %{
      name: "Some User",
      username: "user#{Base.encode16(:crypto.strong_rand_bytes(8))}",
      password: "supersecret",
    })
    
    iex(1)> Enum.into(%{a: 1}, [b: 2])
    [b: 2, a: 1]
    iex(2)> Enum.into([b: 2], %{a: 1})
    %{a: 1, b: 2}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多