Kann jemand den Unterschied zwischen useund erklären require, sowohl bei direkter Verwendung als auch als :useund :requireim nsMakro?
Kann jemand den Unterschied zwischen useund erklären require, sowohl bei direkter Verwendung als auch als :useund :requireim nsMakro?
Antworten:
requireLädt Bibliotheken (die noch nicht geladen sind), usemacht dasselbe und verweist auf deren Namespaces mit clojure.core/refer(so dass Sie auch die Möglichkeit haben, :excludeetc wie mit zu verwenden clojure.core/refer). Beide werden nseher zur Verwendung als direkt empfohlen .
Es ist idiomatisch, externe Funktionen mit requireund 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 usestattdessen 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 ...).