Я действительно хотел избежать назначения временной карты переменной.
Что ж, поскольку данные в определенном месте памяти неизменны, elixir может безопасно использовать указатели на эти места памяти.внутри новые коллекции.Поэтому создание временной переменной с промежуточными результатами не удваивает объем используемой памяти.Например, если вы начинаете с карты, содержащей 1 миллион записей, и создаете новую карту с одной дополнительной записью, вы не используете общую память:
old_map new_map
| |
V V
1 million + ( 1 million + 1)
Скорее, вы используете только дополнительную память:
new_entry
|
V
1 + pointer_to_old_map
... плюс немного больше для учета новой карты.Вот так:
old_map
^
|
new_map = %{ +, a: 10}
Есть ли способ написать сразу:
%{
total: 38,
value: 22,
ratio: __SELF__.value / __SELF__.total
}
Да:
%{
total: 38,
value: 22,
ratio: 22/38
}
Теперь, если выесть список карт, к которым вы хотите добавить коэффициент:
data = [
%{total: 38, value: 22},
%{total: 40, value: 22},
%{total: 44, value: 22}
]
for %{total: t, value: v}=map <- data do
Map.put(map, :ratio, v/t)
end
вывод:
[
%{ratio: 0.5789473684210527, total: 38, value: 22},
%{ratio: 0.55, total: 40, value: 22},
%{ratio: 0.5, total: 44, value: 22}
]
После каждой итерации for comprehension
места памяти t
и v
немедленно подвергаются сборке мусора, и на новой карте используется указатель на область памяти map
.