更新深层嵌套的结构

时间:2016-09-20 11:35:34

标签: elixir

所以,让我说我有以下结构:

%Car{details: [%CarDetail{prices: [%Price{euro: 5}]}]}

我想在汽车细节的价格清单中添加另一个价格结构,我该怎么做?

显然,真实的例子更深入,所以我不能使用模式匹配,我无法想出一种方法来使用put_in/3或类似的东西。

一些帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:10)

您可以使用Kernel.update_in/3遍历嵌套结构。简单地将密钥列表传递给update_in将无法工作,因为结构和列表都不实现访问协议。这是Access.key!/1Access.all进来的地方。请注意,如果有多个代码,下面的代码会将价格添加到所有汽车详细信息中。如果您只需要更新特定详细信息,可以使用Access.at/1implement your own access function

update_in car, [Access.key!(:details), Access.all, Access.key!(:prices)], fn(prices) ->
  [%Price{euro: 12345} | prices]
end

答案 1 :(得分:2)

put_in/2让这一切变得简单:

def add_price(%Car{details: %CarDetails{prices: prices}} = car, new_price) do
  put_in(car.details.prices, [%Price{euro: new_price} | prices])
end