因此,假设我有以下结构:
%Car{details: [%CarDetail{prices: [%Price{euro: 5}]}]}
我想把另一个价格结构添加到汽车细节的价目表中,我该怎么做呢?
显然,真正的例子要深得多,所以我不能使用模式匹配,也不能想出一种使用put_in/3
之类的方法。
如果能提供一些帮助,我们将不胜感激。谢谢。
发布于 2016-09-20 04:34:18
您可以使用Kernel.update_in/3
遍历嵌套结构。它不能简单地将密钥列表传递给update_in
,因为结构和列表都不实现访问协议。这就是Access.key!/1
和Access.all
进来的地方。不过,请注意,下面的代码将添加到所有汽车细节的价格,如果有多个。如果您只需要更新特定的详细信息,则可以使用Access.at/1
或实现您自己的访问功能。
update_in car, [Access.key!(:details), Access.all, Access.key!(:prices)], fn(prices) ->
[%Price{euro: 12345} | prices]
end
发布于 2017-04-14 06:06:49
宏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
https://stackoverflow.com/questions/39593009
复制相似问题