Alguém pode explicar a diferença entre use
e require
, quando usado diretamente e como :use
e :require
na ns
macro?
Alguém pode explicar a diferença entre use
e require
, quando usado diretamente e como :use
e :require
na ns
macro?
Respostas:
require
carrega libs (que ainda não foram carregadas), use
faz o mesmo e se refere aos seus namespaces com clojure.core/refer
(para que você também tenha a possibilidade de usar :exclude
etc como em clojure.core/refer
). Ambos são recomendados para uso em ns
vez de diretamente.
É idiomático incluir funções externas com require
e refer
. Você evita conflitos de espaço para nome, inclui apenas funções que realmente usa / precisa e declara explicitamente o local de cada função:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Não preciso chamar essa função prefixando-a com seu espaço para nome:
(wrap-reload) ; works
Se você não usar, refer
precisará prefixar o espaço para nome:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Se você escolher use
, (praticamente) sempre use only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Caso contrário, você está incluindo tudo, tornando-a uma operação desnecessariamente grande e muito confusa para outros programadores descobrirem onde estão as funções.
Além disso, eu recomendo este blog como um recurso para aprender mais sobre os namespaces do Clojure.
(:use foo :only [bar])
e (:require foo :refer [bar])
? Parece estranho ter duas maneiras de fazer isso.
(:require .. :refer ..)
é uma nova maneira de fazer a mesma coisa que permite que você efetue a depreciação :use
, o que tem algumas desvantagens.
Certifique-se de tornar mais fácil, não exigindo que você soletre o espaço para nome toda vez que quiser chamar uma função, mas também pode causar uma confusão, criando conflitos no espaço para nome. Um bom meio termo entre "use" e "require" é apenas 'usar' as funções de um espaço para nome que você realmente usa.
por exemplo:
(use '[clojure-contrib.duck-streams: only (escritor escritor)])ou melhor ainda, especifique-o na parte superior do arquivo na definição de namespace:
(ns com.me.project (: use [clojure.contrib.test-is: only (deftest é executar testes)]))
(ns ...)
sintaxe; Eu estava procurando por isso, mas todos os exemplos que encontrei foram claros (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Como já foi mencionado, a grande diferença é que (require 'foo)
, com , você se refere a nomes no espaço de nomes da biblioteca da seguinte forma: (foo/bar ...)
se o fizer (use 'foo)
, eles estarão agora no seu espaço de nomes atual (o que quer que seja e desde que não haja conflitos) e você pode chamar eles gostam (bar ...)
.