我可以使用选项accumulate注册模块属性,如此
Module.register_attribute __MODULE__, :structs, accumulate: true
for line <- [%{"some" => %{"test1" => 1, "test2" => 2}}, %{"some" => %{"test1" => 3, "test2" => 4}}] do
@structs %Struct{
some: line["some"]
}
end
然后我有以下列表。
[
%Test.Struct{some: %{"test1" => 3, "test2" => 4}},
%Test.Struct{some: %{"test1" => 1, "test2" => 2}}
]
但是如果我想要一张地图怎么办?怎么能实现这一目标?
我尝试了以下内容来定义@tests[v]
但不会工作
Module.register_attribute __MODULE__, :tests, accumulate: true
@moduledoc """
for line <- [%{"some" => %{"test1" => 1, "test2" => 2}}, %{"some" => %{"test1" => 3, "test2" => 4}}] do
Enum.each(line["some"], fn {k, v} ->
@tests[v] %Struct{
some: k
}
end)
end
答案 0 :(得分:1)
你做不到。 accumulate: true
创建列表,这是hardcoded。
唯一可行的解决方案是使用Module.register_attribute/3
生成不同的变量,并使用Module.put_attribute/3
动态更新变量。