我正在尝试将映射转换为结构,如下所示:
我有一张地图:
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,为什么呢?
为了扩展 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 限制。