Elixir 用另一个列表替换Struct中的列表
我有这个结构:Elixir 用另一个列表替换Struct中的列表,elixir,Elixir,我有这个结构: %MyApp.ScoreTable{ __meta__: #Ecto.Schema.Metadata<:loaded, "score_tables">, id: "7f320636-2176-4af2-9207-6251416dd6c2", inserted_at: ~N[2018-11-04 21:08:26.024733], question: #Ecto.Association.NotLoaded<association :question
%MyApp.ScoreTable{
__meta__: #Ecto.Schema.Metadata<:loaded, "score_tables">,
id: "7f320636-2176-4af2-9207-6251416dd6c2",
inserted_at: ~N[2018-11-04 21:08:26.024733],
question: #Ecto.Association.NotLoaded<association :question is not loaded>,
question_id: "dadc6e57-49f4-4339-9c0f-d40dbc6df534",
season: #Ecto.Association.NotLoaded<association :season is not loaded>,
season_id: "c356bae0-bee8-45df-b035-dc117908bebd",
table_details: %MyApp.TableDetails{
information: [
%{
"team_id" => "7ca4c7ac-850b-4f27-8b6e-1feeb1e0629b",
"team_score" => "N/A"
},
%{"team_id" => "f78c069d-1500-4cfe-a201-13223c417f82", "team_score" => 5},
%{"team_id" => "4b3459a0-f81c-436d-a68c-3a00dea62a2d", "team_score" => 5},
%{"team_id" => "9dff5653-dee4-4fef-9d91-7d53f3861275", "team_score" => 10},
%{"team_id" => "dab53fe6-419b-4a86-a1c6-9c1f65445e12", "team_score" => 15}
]
},
updated_at: ~N[2018-11-04 21:08:26.024739]
}
为了清楚起见,我想用新的地图列表替换旧的列表。我怎样才能做到这一点 您可以使用结构更新语法。假设您的整个数据结构存储在
data
中,而新列表存储在new\u information
中,类似这样的操作将起作用:
data = %{data | table_details: %{data.table_details | information: new_information}}
请注意,更新语法创建了结构的新版本,因此需要将其分配给变量,或者根据需要从函数返回
有时,如果使用关联的宏,您试图实现的目标会更清晰。在这种情况下:
data = put_in(data, [Access.key(:table_details), Access.key(:information)], new_information)
这基本上做了相同的事情,但是您只需要指定更改的路径和要更改的内容。在前面的示例中,可能会出现类似
%{other_data.table_details | information:new_information}
(注意other_data
而不是data
)的错误,在这种情况下,很容易一眼就看出只有结构的一部分被修改了。这是一些很棒的信息。谢谢你的帮助。
data = put_in(data, [Access.key(:table_details), Access.key(:information)], new_information)