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)