¿Alguien puede explicar la diferencia entre usey require, tanto cuando se usa directamente como como :usey :requireen la nsmacro?
¿Alguien puede explicar la diferencia entre usey require, tanto cuando se usa directamente como como :usey :requireen la nsmacro?
Respuestas:
requirecarga las bibliotecas (que aún no están cargadas), usehace lo mismo y se refiere a sus espacios de nombres con clojure.core/refer(por lo que también tiene la posibilidad de usar, :excludeetc., como con clojure.core/refer). Ambos se recomiendan para su uso en nslugar de directamente.
Es idiomático incluir funciones externas con requirey 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 uselugar, (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 ...).