Реф-набор против коммутируют против изменения


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

1 52

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