В чем разница в 3 способах установки значения ref в Clojure? Я несколько раз читал документы о ref-set, commute и alter. Я довольно смущен тем, какие из них использовать в какое время. Может ли кто-нибудь дать мне краткое описание того, что такое различия и почему каждый из них необходим?
Ref-set vs commute vs alter
Ответ 1
Как простое объяснение того, как работает система транзакционной памяти программного обеспечения в clojure; он повторяет транзакции, пока все из них не пройдут, не изменив значения из-под нее. Вы можете помочь ему принять это решение, используя функции ref-change-functions, которые дают ему подсказки о том, какие взаимодействия безопасны между транзакциями.
-
ref-set
используется, когда вам не нужно текущее значение. Просто установите это на!ref-set
избавляет вас от написания чего-то вроде(alter my-ref (fun [_] 4))
, чтобы установить значение my-ref на 4.(ref-set my-ref 4)
уверен, что выглядит намного лучше:).
Используйтеref-set
, чтобы просто установить значение. -
alter
является самым обычным стандартным. Используйте эту функцию для изменения значения. Это мясо СТМ. Он использует переданную вами функцию для изменения значения и повторяет попытку, если не может гарантировать, что значение не изменилось с начала транзакции. Это очень безопасно, даже в некоторых случаях, когда вам не нужно, чтобы это было безопасно, например, увеличивая счетчик. Вы, вероятно, захотите использоватьalter
большую часть времени. -
commute
- это оптимизированная версия alter для тех времен, когда порядок вещей действительно не имеет значения. не имеет значения, кто добавил, что +1 к счетчику. Результат тот же. Если STM решает, безопасна ли транзакция для совершения транзакции, и она имеет только конфликты при коммутируемых операциях и ни одна из них не может быть изменена, то она может идти вперед и фиксировать новые значения без необходимости перезапуска любого пользователя. Это может спасти случайную попытку транзакции, хотя вы не увидите огромные выгоды от этого в обычном коде.
Используйтеcommute
, когда сможете.