所以我們可以說我有以下結構:Updating(升級)深度嵌套結構
%Car{details: [%CarDetail{prices: [%Price{euro: 5}]}]}
,我想另一個價格結構增加了車詳細的價格清單,我會怎麼做呢?
很明顯,真正的例子是更深的,所以我不能使用模式匹配,我不能想出一種方式來使用put_in/3
或類似的東西。
一些幫助,將不勝感激。謝謝。
所以我們可以說我有以下結構:Updating(升級)深度嵌套結構
%Car{details: [%CarDetail{prices: [%Price{euro: 5}]}]}
,我想另一個價格結構增加了車詳細的價格清單,我會怎麼做呢?
很明顯,真正的例子是更深的,所以我不能使用模式匹配,我不能想出一種方式來使用put_in/3
或類似的東西。
一些幫助,將不勝感激。謝謝。
您可以使用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
整潔!感謝分享! –
宏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
請出示期望的結果。它是'%Car {details:[%CarDetail {價格:[%價格{euro:5}],%價格{euro:10}]}]}'? – mudasobwa
@mudasobwa是的,就是這樣。 – JustMichael