clojure - online - diferencia entre uso y requiere
clojure vs scala (4)
¿Alguien puede explicar la diferencia entre el use
y el require
, tanto cuando se usa directamente como como :use
y :require
en la macro ns
?
Como se ha mencionado, la gran diferencia es que con (require ''foo)
, luego se refieren a los nombres en el espacio de nombres de lib como sigue: (foo/bar ...)
si lo hace (use ''foo)
entonces están ahora en su el espacio de nombres actual (cualquiera que sea y siempre que no haya conflictos) y puede llamarlos como (bar ...)
.
El uso seguro lo hace más fácil al no requerir que deletree el espacio de nombres cada vez que quiera llamar a una función, aunque también puede hacer un lío de cosas creando conflictos de espacio de nombres. Un buen punto medio entre "usar" y "requerir" es solo "usar" las funciones de un espacio de nombres que realmente usa.
por ejemplo:
(use ''[clojure-contrib.duck-streams :only (writer reader)]) o incluso mejor, especifíquelo en la parte superior del archivo en la definición del espacio de nombres:
(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))
Es idiomático incluir funciones externas con require
y refer
. Evita conflictos de espacios de nombres, solo incluye funciones que realmente usa / necesita, y declara explícitamente la ubicación de cada función.
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
No tengo que invocar esta función precediéndola con su espacio de nombres.
(wrap-reload) ; works
Si no usas refer
necesitarás proceder con el espacio de nombres.
(ring.middleware.reload/wrap-reload) ; works if you don''t use refer in your require
Si elige use
en use
lugar, (más o menos) siempre use only
.
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
De lo contrario, está incluyendo todo, lo que lo convierte en una operación innecesariamente grande y muy confuso para otros programadores para encontrar dónde viven las funciones.
Además, recomiendo este blog como recurso para aprender más sobre los espacios de nombres de Clojure.
require
cargas libs (que no están ya cargadas), use
hace lo mismo y se refiere a sus espacios de nombres con clojure.core/refer
(para que también tenga la posibilidad de usar :exclude
etc como con clojure.core/refer
). Ambos se recomiendan para su uso en ns
en lugar de directamente.