2012-10-09 27 views
7

En cuanto a clojure.testsource code, vi a los siguientes:¿Cuál es el uso de ^: dinámico en una definición?

(defonce ^:dynamic 
    ^{:doc "True by default. If set to false, no test functions will 
    be created by deftest, set-test, or with-test. Use this to omit 
    tests when compiling or loading production code." 
    :added "1.1"} 
    *load-tests* true) 

¿Hay alguna ventaja o razón detrás de la prevención de redefinición (es decir, usando defonce) de un var que está marcado como ^:dynamic?

+0

¿Podría ser para evitar una advertencia del compilador sobre tener una var no dinámica llamada '* something *'? – thoferon

+0

Entonces la pregunta sería por qué usar orejeras en el nombre, que expresa exactamente el mismo significado de '^: dynamic' en versiones anteriores de Clojure. Comprobaré si las versiones anteriores de 'clojure.test' están usando diferentes estrategias' def' para esa var. – skuro

Respuesta

4

defonce no impide la redefinición en general, pero solo cuando uno vuelve a cargar el archivo. Esto es útil típicamente cuando la var está manteniendo algún tipo de estado o contexto. Creo que el uso de defonce aquí, podría ser un artefacto del desarrollo de la biblioteca, donde el desarrollador necesita volver a cargar el archivo muchas veces durante el desarrollo, mientras que todavía quiere conservar el mismo valor.

Dado que la var no está apuntando a una referencia, sino a una var directa, el uso de ^:dynamic es la elección correcta. Ahora el código puede usar set! o binding para cambiar el valor de una manera local de subprocesos.

Cuestiones relacionadas