Kann jemand den Unterschied zwischen use
und erklären require
, sowohl bei direkter Verwendung als auch als :use
und :require
im ns
Makro?
Kann jemand den Unterschied zwischen use
und erklären require
, sowohl bei direkter Verwendung als auch als :use
und :require
im ns
Makro?
Antworten:
require
Lädt Bibliotheken (die noch nicht geladen sind), use
macht dasselbe und verweist auf deren Namespaces mit clojure.core/refer
(so dass Sie auch die Möglichkeit haben, :exclude
etc wie mit zu verwenden clojure.core/refer
). Beide werden ns
eher zur Verwendung als direkt empfohlen .
Es ist idiomatisch, externe Funktionen mit require
und einzuschließen refer
. Sie vermeiden Namespace-Konflikte, schließen nur Funktionen ein, die Sie tatsächlich verwenden / benötigen, und Sie deklarieren explizit den Speicherort jeder Funktion:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Ich muss diese Funktion nicht aufrufen, indem ich ihr den Namespace voranstelle:
(wrap-reload) ; works
Wenn Sie nicht verwenden refer
, müssen Sie ihm den Namespace voranstellen:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Wenn Sie use
stattdessen wählen , verwenden Sie (so ziemlich) immer only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Andernfalls schließen Sie alles ein, was es für andere Programmierer sowohl unnötig umfangreich als auch sehr verwirrend macht, herauszufinden, wo sich die Funktionen befinden.
Außerdem empfehle ich diesen Blog als Ressource, um mehr über Clojure-Namespaces zu erfahren.
(:use foo :only [bar])
und gibt (:require foo :refer [bar])
? Es scheint seltsam, zwei Möglichkeiten zu haben, dies zu tun.
(:require .. :refer ..)
ist eine neue Methode, um das Gleiche zu tun, mit der Sie effektiv ablehnen können :use
, was einige Nachteile hat.
Verwenden Sie dies sicher, um es einfacher zu machen, indem Sie den Namespace nicht jedes Mal buchstabieren müssen, wenn Sie eine Funktion aufrufen möchten. Es kann jedoch auch zu Problemen führen, indem Namespace-Konflikte entstehen. Ein guter Mittelweg zwischen "use" und "require" besteht darin, nur die Funktionen aus einem Namespace zu "verwenden", den Sie tatsächlich verwenden.
zum Beispiel:
(benutze '[clojure-Contrib.duck-Streams: nur (Writer Reader)])oder noch besser, geben Sie es oben in der Datei in der Namespace-Definition an:
(ns com.me.project (: benutze [clojure.contrib.test-is: only (Geschicklichkeit ist Run-Tests)]))
(ns ...)
Syntax (Wortspiel) eingefügt haben. Ich hatte danach gesucht, aber alle Beispiele, die ich fand, waren einfach (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Wie bereits erwähnt, besteht der große Unterschied darin, dass (require 'foo)
Sie sich dann wie folgt auf Namen im Namespace der Bibliothek beziehen: (foo/bar ...)
Wenn Sie dies tun (use 'foo)
, befinden sie sich jetzt in Ihrem aktuellen Namespace (was auch immer das sein mag und vorausgesetzt, es gibt keine Konflikte) und Sie können anrufen sie mögen (bar ...)
.