2010-06-17 4 views
5

У меня есть число атомов в моем коде, где общее требование - обновить их до нового значения, независимо от текущего значения.Обновление атома с одним значением

поэтому я считаю себя писать что-то вроде этого:

(swap! atom-name (fn [_] (identity new-value))) 

Это работает, но кажется довольно некрасиво и, предположительно, берет штраф производительности для построения анонимного закрытия.

Есть ли лучший способ?

ответ

8

Функция reset! должна сделать это.

+0

awesome ... именно то, что я искал! – mikera

1

Вы можете использовать (сравнить и установить новое значение нового значения атома).

Но я нахожу странным, что вам нужно так сильно изменить их на некоррелированные значения. Нельзя использовать привязки или подобные вещи.

+0

Он предназначен для управления единым общим совместным состоянием по потокам, поэтому привязки не будут работать. Атомы AFAICS кажутся стандартным способом сделать это ..... – mikera

+0

Правда, но меня беспокоит семантика глобальной переменной, которая часто меняет значение, которое не может быть преобразовано из предыдущего значения. С привязкой вы делаете снимок «общего» состояния до тех пор, пока область захвата не будет снова оставлена. Если это неприемлемо, тогда должны быть связанные зависимости по времени между потоками и какая-то межпоточная связь через атом. Я не приходил в такой случай, как обычно, у меня обычно есть такие вещи, как конфигурация, агрегации или сеансы/кеши в атомах. –

+0

Пример: таймеры в симуляции. В разных потоках может потребоваться прочитать последнюю глобальную метку времени, только один поток когда-либо обновляет ее. Обновление не зависит от предыдущего значения. – mikera

Смежные вопросы