Кто-нибудь может объяснить разницу между use
и require
, как при непосредственном использовании, так и как :use
и :require
в ns
макросе?
Кто-нибудь может объяснить разницу между use
и require
, как при непосредственном использовании, так и как :use
и :require
в ns
макросе?
Ответы:
require
загружает библиотеки (которые еще не загружены), use
делает то же самое, плюс к ним относится их пространство имен clojure.core/refer
(так что вы также можете использовать и :exclude
т.д., как с clojure.core/refer
). Оба рекомендуются для использования, ns
а не напрямую.
Идиоматично включать внешние функции с require
и refer
. Вы избегаете конфликтов пространства имен, вы включаете только те функции, которые вы фактически используете / нуждаетесь, и вы явно объявляете местоположение каждой функции:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Мне не нужно вызывать эту функцию путем добавления префикса к ее пространству имен:
(wrap-reload) ; works
Если вы не используете, refer
вам нужно добавить префикс к пространству имен:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Если вы выбираете use
вместо этого (в значительной степени) всегда используйте only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
В противном случае вы включаете все, что делает это неоправданно большой операцией и очень запутанным для других программистов, чтобы найти, где живут функции.
Кроме того, я настоятельно рекомендую этот блог в качестве ресурса для получения дополнительной информации о пространствах имен Clojure.
(:use foo :only [bar])
и (:require foo :refer [bar])
? Кажется странным иметь два способа сделать это.
(:require .. :refer ..)
это новый способ сделать то же самое, что позволяет эффективно отказаться :use
, что имеет некоторые недостатки.
Убедитесь, что это действительно облегчает задачу, не требуя, чтобы вы прописывали пространство имен каждый раз, когда вы хотите вызвать функцию, хотя это также может привести к путанице, создавая конфликты пространства имен. Хорошим промежуточным звеном между «use» и «require» является только «использование» функций из пространства имен, которое вы фактически используете.
например:
(используйте '[clojure-contrib.duck-streams: only (писатель читатель)])или, что еще лучше, укажите его в начале файла в определении пространства имен:
(ns com.me.project (: использовать [clojure.contrib.test-is: only (deftest является run-tests)]))
(ns ...)
синтаксиса; Я искал это, но все примеры, которые я нашел, были для простого (use ...)
.
(require '[namepase :refer [var-name1 var-name2]])
Как уже упоминалось, большая разница заключается в том (require 'foo)
, что с помощью этого вы затем ссылаетесь на имена в пространстве имен библиотеки следующим образом: (foo/bar ...)
если вы это сделаете, (use 'foo)
то они теперь находятся в вашем текущем пространстве имен (что бы это ни было и при условии отсутствия конфликтов), и вы можете вызвать им нравится (bar ...)
.