¿Alguien puede explicar la diferencia entre use
y require
, tanto cuando se usa directamente como como :use
y :require
en la ns
macro?
¿Alguien puede explicar la diferencia entre use
y require
, tanto cuando se usa directamente como como :use
y :require
en la ns
macro?
Respuestas:
require
carga las bibliotecas (que aún no están cargadas), use
hace lo mismo y se refiere a sus espacios de nombres con clojure.core/refer
(por lo que también tiene la posibilidad de usar, :exclude
etc., como con clojure.core/refer
). Ambos se recomiendan para su uso en ns
lugar de directamente.
Es idiomático incluir funciones externas con require
y refer
. Evita conflictos de espacio 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 con el prefijo con su espacio de nombres:
(wrap-reload) ; works
Si no lo usa refer
, necesitará ponerle el prefijo con el espacio de nombres:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Si eliges en su use
lugar, (más o menos) siempre usa 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 confusa para que otros programadores encuentren dónde viven las funciones.
Además, recomiendo este blog como un recurso para aprender más sobre los espacios de nombres de Clojure.
(:use foo :only [bar])
y (:require foo :refer [bar])
? Parece extraño tener dos formas de hacer esto.
(:require .. :refer ..)
es una nueva forma de hacer lo mismo que le permite desaprobar efectivamente :use
, lo que tiene algunos inconvenientes.
El uso seguro hace que sea más fácil al no requerir que deletree el espacio de nombres cada vez que desee llamar a una función, aunque también puede causar problemas creando conflictos de espacio de nombres. Un buen término 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 (escritor lector)])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 es run-tests)]))
(ns ...)
sintaxis; Había estado buscando eso, pero todos los ejemplos que encontré eran simples (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Como se ha mencionado, la gran diferencia es que con (require 'foo)
, luego se refiere a los nombres en el espacio de nombres de la biblioteca de la siguiente manera: (foo/bar ...)
si lo hace (use 'foo)
, ahora están en su espacio de nombres actual (sea lo que sea y siempre que no haya conflictos) y puede llamar como ellos (bar ...)
.