clojure - simple - ref-set vs conmutar vs alterar
interruptor de conmutacion triple (1)
¿Cuál es la diferencia en las 3 formas de establecer el valor de una referencia en Clojure? He leído los documentos varias veces sobre ref-set, conmutar y modificar. Estoy bastante confundido cuáles usar en qué momentos. ¿Puede alguien darme una breve descripción de cuáles son las diferencias y por qué se necesita cada una?
Como una explicación súper simple de cómo funciona el sistema de memoria transaccional de software en clojure; reintenta transacciones hasta que todos puedan pasar sin que se modifiquen sus valores. Puede ayudarlo a tomar esta decisión utilizando ref-changing-functions que le dan pistas sobre qué interacciones son seguras entre las transacciones.
ref-set
es para cuando no te importa el valor actual. ¡Solo prepáralo para esto !ref-set
te ahorra la angustia de escribir algo como(alter my-ref (fun [_] 4))
solo para establecer el valor de my-ref en 4.(ref-set my-ref 4)
seguro se ve mucho mejor :).
Useref-set
para simplemente establecer el valor.alter
es el estándar más normal. Use esta función para alterar el valor. Esta es la carne del STM. Utiliza la función que pasa para cambiar el valor y vuelve a intentar si no puede garantizar que el valor no se modificó desde el inicio de la transacción. Esto es muy seguro, incluso en algunos casos en los que no necesita que sea tan seguro, como incrementar un contador. Probablemente quiera usaralter
mayor parte del tiempo.commute
es una versión optimizada de alter para aquellos tiempos en los que el orden de las cosas realmente no importa. no importa quién haya agregado qué +1 al contador. El resultado es el mismo. Si el STM está decidiendo si su transacción es segura para comprometerse y solo tiene conflictos en las operaciones de conmutación y ninguna en las operaciones de modificación, entonces puede continuar y comprometer los nuevos valores sin tener que reiniciar a nadie. Esto puede ahorrar el intento de reinicio de transacciones ocasionales, aunque no verá grandes ganancias de esto en el código normal.
Usa elcommute
cuando puedas.