所以,让我说我有以下结构:
%Car{details: [%CarDetail{prices: [%Price{euro: 5}]}]}
我想在汽车细节的价格清单中添加另一个价格结构,我该怎么做?
显然,真实的例子更深入,所以我不能使用模式匹配,我无法想出一种方法来使用put_in/3
或类似的东西。
一些帮助将不胜感激。谢谢。
答案 0 :(得分:10)
您可以使用Kernel.update_in/3
遍历嵌套结构。简单地将密钥列表传递给update_in
将无法工作,因为结构和列表都不实现访问协议。这是Access.key!/1
和Access.all
进来的地方。请注意,如果有多个代码,下面的代码会将价格添加到所有汽车详细信息中。如果您只需要更新特定详细信息,可以使用Access.at/1
或implement 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