2016-09-20 69 views
1

所以我們可以說我有以下結構:Updating(升級)深度嵌套結構

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

,我想另一個價格結構增加了車詳細的價格清單,我會怎麼做呢?

很明顯,真正的例子是更深的,所以我不能使用模式匹配,我不能想出一種方式來使用put_in/3或類似的東西。

一些幫助,將不勝感激。謝謝。

+0

請出示期望的結果。它是'%Car {details:[%CarDetail {價格:[%價格{euro:5}],%價格{euro:10}]}]}'? – mudasobwa

+0

@mudasobwa是的,就是這樣。 – JustMichael

回答

7

您可以使用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 
+0

整潔!感謝分享! –

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