Некоторые функции, которые манипулируют Tuples
в Erlang , приводят к копированию новых кортежей после операции.В большинстве случаев программа больше не интересуется старой копией кортежа, из которой была сделана новая.Давайте рассмотрим пример:
change(Position,Tuple1,NewValue) when size(Tuple1) > 10,Position < 10 ->
NewTuple = erlang:setelement(Position, Tuple1, NewValue),
%% at this point i don't want <b>Tuple1</b>
%% I want to destroy <b>Tuple1</b> at this point !
%% how do i do it
erlang:send(myprocess,NewTuple),
ok.
В приведенном выше примере я создаю новый кортеж из существующего.Если я собираюсь сделать это впоследствии, я бы хотел уничтожить старые копии сам.У меня есть ощущение, что система компилятора / среды выполнения делает это автоматически, но если бы это было так, они бы не дали нам такие функции, как: erlang:garbage_collect/0
.Я уверен, что они поняли, что нам, возможно, понадобится неявно управлять нашей памятью, возможно, это спасет программу от сбоев и обойдет часть кода, интенсивно использующую память.
Я понимаю, чтов erlang shell
можно заставить его забыть переменную (я предполагаю, что они имели в виду уничтожить переменную), используя f/0, f/1
.Тем не менее, кажется, я не могу использовать это в моих модулях / функциях.У меня также есть сомнения, что размещение подчеркивания перед этим именем переменной может ускорить уничтожение системой времени выполнения, то есть где-то в моем коде пишется: _Tuple1
для уничтожения Tuple1
.Таким образом, вопрос в том, если я впоследствии собираюсь создавать кортежи из существующих и на каждом шаге я хочу немедленно (сам) уничтожать старые копии, как мне это сделать? * Примечание * Я понимаю, что руководство по эффективности запрещает это, но, если у меня нет выбора .....
Ребята, помогите, каково ваше решение для этого?спасибо