2016-09-20 2 views
1

Так скажем, у меня есть следующая структура:Обновления глубоко вложенный-структуру

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

, и я хочу добавить еще один ценовую-структуру в список цен на детали автомобиля, как бы я это сделать?

Очевидно, что реальный пример намного глубже, поэтому я не могу использовать сопоставление с образцом, и я не могу придумать способ использования put_in/3 или что-то в этом роде.

Некоторая помощь будет оценена по достоинству. Спасибо.

+0

Пожалуйста, покажите желаемый результат. Это будет '% Car {подробности: [% CarDetail {цены: [% Цена {евро: 5}],% Цена {евро: 10}]}]}'? – mudasobwa

+0

@mudasobwa Да, вот и все. – JustMichael

ответ

7

Вы можете использовать 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 
+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 
Смежные вопросы