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