Czy ktoś może wyjaśnić różnicę między use
i require
, zarówno w przypadku użycia bezpośrednio, jak :use
i :require
w ns
makrze?
Czy ktoś może wyjaśnić różnicę między use
i require
, zarówno w przypadku użycia bezpośrednio, jak :use
i :require
w ns
makrze?
Odpowiedzi:
require
ładuje biblioteki (które nie są jeszcze załadowane), use
robi to samo, a dodatkowo odwołuje się do ich przestrzeni nazw clojure.core/refer
(więc masz również możliwość używania :exclude
itp. tak jak z clojure.core/refer
). Oba są zalecane ns
raczej do użycia w niż bezpośrednio.
Dołączanie funkcji zewnętrznych za pomocą require
i jest idiomatyczne refer
. Unikasz konfliktów przestrzeni nazw, dołączasz tylko funkcje, których faktycznie używasz / potrzebujesz, i jawnie deklarujesz lokalizację każdej funkcji:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Nie muszę wywoływać tej funkcji, poprzedzając ją jej przestrzenią nazw:
(wrap-reload) ; works
Jeśli nie używasz refer
, musisz poprzedzić go przestrzenią nazw:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Jeśli wybierzesz use
zamiast tego, (prawie) zawsze używaj only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
W przeciwnym razie dołączasz wszystko, co sprawia, że jest to zarówno niepotrzebnie duża operacja, jak i bardzo mylące dla innych programistów, aby dowiedzieć się, gdzie znajdują się funkcje.
Bardzo polecam również ten blog jako źródło informacji o przestrzeniach nazw Clojure.
(:use foo :only [bar])
i (:require foo :refer [bar])
? Wydaje się dziwne, że można to zrobić na dwa sposoby.
(:require .. :refer ..)
to nowy sposób na zrobienie tego samego, który pozwala skutecznie wycofać z użycia :use
, co ma pewne wady.
Używanie sure sprawia, że jest to łatwiejsze, ponieważ nie wymaga przeliterowania przestrzeni nazw za każdym razem, gdy chcesz wywołać funkcję, chociaż może również narobić bałaganu, tworząc konflikty przestrzeni nazw. Dobrym punktem pośrednim między „użyj” a „wymagaj” jest „używanie” tylko funkcji z przestrzeni nazw, której faktycznie używasz.
na przykład:
(użyj '[clojure-contrib.duck-streams: only (pisarz czytelnik)])lub nawet lepiej, określ go na górze pliku w definicji przestrzeni nazw:
(ns com.me.project (: use [clojure.contrib.test-is: only (deftest to run-tests)]))
(ns ...)
składni; Szukałem tego, ale wszystkie przykłady, które znalazłem, były proste (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Jak już wspomniano, duża różnica polega na tym (require 'foo)
, że z , następnie odwołujesz się do nazw w przestrzeni nazw biblioteki w ten sposób: (foo/bar ...)
jeśli to zrobisz (use 'foo)
, znajdują się one teraz w twojej bieżącej przestrzeni nazw (cokolwiek to może być i pod warunkiem, że nie ma konfliktów) i możesz wywołać im się podoba (bar ...)
.