la différence entre l'usage et le besoin
Quelqu'un peut-il expliquer la différence entre use
et require
, à la fois lorsqu'ils sont utilisés directement et comme :use
et :require
dans le ns
macro?
- Voir aussi stackoverflow.com/questions/10358149/... pour les ns de la macro; en clojure 1.4, il est suggéré que vous utilisez :de préférence à :utiliser
Vous devez vous connecter pour publier un commentaire.
require
charges libs (qui ne sont pas déjà chargé),use
fait la même plus il se réfère à leurs espaces de noms avecclojure.core/refer
(si vous bénéficiez également de la possibilité d'utiliser:exclude
etc comme avecclojure.core/refer
). Les deux sont recommandés pour une utilisation dansns
plutôt que directement.C'est idiomatiques pour inclure des fonctions externes avec
require
etrefer
. 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:Je n'ai pas à appeler cette fonction en préfixant avec son espace de noms:
Si vous n'utilisez pas
refer
vous aurez besoin de le préfixer avec l'espace de noms:Si vous choisissez
use
au lieu de cela, (presque) toujours utiliseronly
: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.
Aussi, je recommande fortement ce blog comme une ressource pour apprendre plus au sujet de Clojure espaces de noms.
(:use foo :only [bar])
et(:require foo :refer [bar])
? Me semble bizarre d'avoir deux façons de le faire.(:require .. :refer ..)
est une nouvelle façon de faire la même chose que permet effectivement de rendre caduque:use
, qui a aussi quelques inconvénients.Utilisez sûr, il est plus facile de ne pas exiger de vous préciser l'espace de noms à 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 noms. Un bon compromis entre "usage" et "exiger" est à seulement l '"utilisation" des fonctions à partir d'un espace de noms que vous utilisez réellement.
par exemple:
ou mieux encore, de le spécifier dans le haut du fichier dans l'espace de noms définition:
(ns ...)
syntaxe; j'avais été à la recherche pour cela, mais tous les exemples que j'ai trouvés étaient de simples(use ...)
.(require '[namepase :refer [var-name1 var-name2]])
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:(foo/bar ...)
si vous ne(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 ...)
.