Quelqu'un peut-il expliquer la différence entre use
et require
, à la fois lorsqu'ils sont utilisés directement et en tant que :use
et :require
dans la ns
macro?
Réponses
Trop de publicités?require
charges libs (qui ne sont pas déjà chargé), use
fait de même , plus il se réfère à leurs espaces de noms avec clojure.core/refer
(si vous bénéficiez également de la possibilité d'utiliser :exclude
etc comme avec clojure.core/refer
). Les deux sont recommandés pour une utilisation en ns
plutôt que directement.
C'est idiomatiques pour inclure des fonctions externes avec require
et refer
. Vous éviter les conflits d'espace de noms, vous devez inclure seulement les fonctions que vous utilisez vraiment/besoin, et vous déclarer explicitement chaque fonction de l'emplacement.
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Je n'ai pas à invoquer cette fonction par le précédant, avec son espace de noms.
(wrap-reload) ; works
Si vous n'utilisez pas refer
vous aurez besoin de procéder avec l'espace de noms.
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Si vous choisissez use
au lieu de cela, (presque) toujours utiliser only
.
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Sinon, vous avez tout compris, le rendant à la fois inutilement opération de grande ampleur et très déroutant pour d'autres programmeurs pour trouver où les fonctions de vivre.
Utilisez sûr, il est plus facile de ne pas exiger que vous épeler le nom de l'espace à chaque fois que vous voulez l'appeler une fonction, mais on peut également en faire un désordre des choses en créant des conflits d'espace de nom. Un bon compromis entre "usage" et "exiger" est à seulement l '"utilisation" des fonctions à partir d'un espace de nom que vous utilisez réellement.
par exemple:
(utilisation " [clojure-contrib.canard-flux :seul (écrivain reader)])ou mieux encore, de le spécifier dans le haut du fichier dans l'espace de noms deffinition:
(ns com.moi.projet (:utilisez [clojure.contrib.test-est :seul (deftest est de l'exécution des tests)]))
Comme il a été mentionné la grande différence est que, avec (require 'foo)
, vous pouvez vous référer à des noms dans le répertoire lib de l'espace de noms comme suit: (foo/bar ...)
si vous n' (use 'foo)
alors qu'ils sont maintenant dans votre espace de noms courant (quel qu'il soit et il n'existe pas de conflits) et vous pouvez l'appeler comme (bar ...)
.