Qualcuno può spiegare la differenza tra usee require, sia quando usato direttamente sia come :usee :requirenella nsmacro?
Qualcuno può spiegare la differenza tra usee require, sia quando usato direttamente sia come :usee :requirenella nsmacro?
Risposte:
requirecarica le librerie (che non sono già state caricate), usefa lo stesso e fa riferimento ai loro spazi dei nomi con clojure.core/refer(quindi hai anche la possibilità di usare :excludeetc come con clojure.core/refer). Entrambi sono raccomandati per l'uso nspiuttosto che direttamente.
È idiomatico includere funzioni esterne con requiree 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, referdevi aggiungere il prefisso allo spazio dei nomi:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Se useinvece 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 ...).