将映射转换为结构

zer*_*ing 7 elixir

我正在尝试将映射转换为结构,如下所示:

我有一张地图:

iex(6)> user                      
%{"basic_auth" => "Basic Ym1hOmphYnJhMTc=", "firstname" => "foo",
  "lastname" => "boo"}
Run Code Online (Sandbox Code Playgroud)

该值应应用于结构:

iex(7)> a = struct(UserInfo, user)
%SapOdataService.Auth.UserInfo{basic_auth: nil, firstname: nil, lastname: nil}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,struct 的值是 nil,为什么呢?

Pat*_*ity 8

为了扩展 JustMichael 的答案,您可以首先使用 将键转换为原子String.to_existing_atom/1,然后Kernel.struct/2构建结构:

user_with_atom_keys = for {key, val} <- user, into: %{} do
  {String.to_existing_atom(key), val}
end

user_struct = struct(UserInfo, user_with_atom_keys)
# %UserInfo{basic_auth: "Basic Ym1hOmphYnJhMTc=", firstname: "foo",
 lastname: "boo"}
Run Code Online (Sandbox Code Playgroud)

请注意,这用于String.to_existing_atom/1防止 VM 达到全局 Atom 限制。