Подтвердить что ты не робот

Ref-set vs commute vs alter

В чем разница в 3 способах установки значения ref в Clojure? Я несколько раз читал документы о ref-set, commute и alter. Я довольно смущен тем, какие из них использовать в какое время. Может ли кто-нибудь дать мне краткое описание того, что такое различия и почему каждый из них необходим?

4b9b3361

Ответ 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, когда сможете.