161 votes

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 en tant que :use et :require dans la ns macro?

102voto

Alex Martelli Points 330805

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.

71voto

rzv Points 596

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.

35voto

Arthur Ulfeldt Points 45059

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)]))

21voto

twopoint718 Points 1156

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 ...).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X