Qualcuno può spiegare la differenza tra use
e require
, sia quando usato direttamente sia come :use
e :require
nella ns
macro?
Qualcuno può spiegare la differenza tra use
e require
, sia quando usato direttamente sia come :use
e :require
nella ns
macro?
Risposte:
require
carica le librerie (che non sono già state caricate), use
fa lo stesso e fa riferimento ai loro spazi dei nomi con clojure.core/refer
(quindi hai anche la possibilità di usare :exclude
etc come con clojure.core/refer
). Entrambi sono raccomandati per l'uso ns
piuttosto che direttamente.
È idiomatico includere funzioni esterne con require
e refer
. Si evitano conflitti nello spazio dei nomi, si includono solo le funzioni effettivamente utilizzate / necessarie e si dichiara esplicitamente la posizione di ciascuna funzione:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Non devo invocare questa funzione anteponendola con il suo spazio dei nomi:
(wrap-reload) ; works
Se non lo usi, refer
devi aggiungere il prefisso allo spazio dei nomi:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Se use
invece scegli , (praticamente) usa sempre only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Altrimenti stai includendo tutto, rendendolo un'operazione inutilmente grande e molto confusa per gli altri programmatori per trovare dove vivono le funzioni.
Consiglio vivamente questo blog come risorsa per saperne di più sugli spazi dei nomi Clojure.
(:use foo :only [bar])
e (:require foo :refer [bar])
? Sembra strano avere due modi per farlo.
(:require .. :refer ..)
è un nuovo modo di fare la stessa cosa che ti consente di deprecare efficacemente :use
, con alcuni inconvenienti.
L'uso sicuro rende più semplice non richiedendo di precisare lo spazio dei nomi ogni volta che si desidera chiamare una funzione, sebbene possa anche creare confusione creando conflitti tra spazi dei nomi. Una buona via di mezzo tra "usa" e "richiede" è di "usare" solo le funzioni di uno spazio dei nomi che effettivamente usi.
per esempio:
(usa '[clojure-contrib.duck-streams: only (writer reader)])o ancora meglio, specificalo nella parte superiore del file nella definizione dello spazio dei nomi:
(ns com.me.project (: usa [clojure.contrib.test-is: only (deftest is run-test)]))
(ns ...)
sintassi; Lo stavo cercando, ma tutti gli esempi che ho trovato erano chiari (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Come è stato detto, la grande differenza è che (require 'foo)
, quindi, fai riferimento ai nomi nello spazio dei nomi della lib in questo modo: (foo/bar ...)
se lo fai (use 'foo)
, ora sono nel tuo spazio dei nomi attuale (qualunque cosa sia e purché non ci siano conflitti) e puoi chiamare a loro piace (bar ...)
.