Разница между использованием и потребностью - PullRequest
147 голосов
/ 16 мая 2009

Может кто-нибудь объяснить разницу между use и require, как при непосредственном использовании, так и как :use и :require в макросе ns?

Ответы [ 4 ]

96 голосов
/ 16 мая 2009

require загружает библиотеки (которые еще не загружены), use делает то же самое плюс это относится к их пространствам имен с clojure.core/refer (так что вы также получаете возможность использовать :exclude и т. д. как с clojure.core/refer). Оба рекомендуются для использования в ns, а не напрямую.

58 голосов
/ 08 мая 2013

Идиоматично включать внешние функции с 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.

33 голосов
/ 20 июня 2009

Используйте наверняка, это облегчает задачу, не требуя, чтобы вы произносили пространство имен каждый раз, когда вы хотите вызвать функцию, хотя это также может вносить беспорядок, создавая конфликты пространства имен. Хорошим промежуточным положением между «использовать» и «требовать» является только «использование» функций из пространства имен, которое вы фактически используете.

например:

 (use '[clojure-contrib.duck-streams :only (writer reader)])
или, что еще лучше, укажите его в начале файла в определении пространства имен:
(ns com.me.project
   (:use [clojure.contrib.test-is :only (deftest is run-tests)]))
18 голосов
/ 18 июня 2009

Как уже упоминалось, большая разница в том, что с (require 'foo) вы затем ссылаетесь на имена в пространстве имен библиотеки следующим образом: (foo/bar ...) если вы делаете (use 'foo), то они теперь находятся в вашем текущем пространстве имен (что бы это ни быть и при условии, что нет никаких конфликтов), и вы можете назвать их как (bar ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...