有人能解释 use和 require之间的区别吗? 无论是直接使用还是在 ns宏中作为 :use和 :require?
use
require
ns
:use
:require
require加载库(还没有加载) ,use加载相同的 还有,它使用 clojure.core/refer引用它们的名称空间(所以你也可以使用 :exclude等等,就像使用 clojure.core/refer一样)。建议在 ns中使用,而不是直接使用。
clojure.core/refer
:exclude
如前所述,最大的区别在于使用 (require 'foo)时,您可以在库的名称空间中引用名称,比如: (foo/bar ...)如果使用 (use 'foo),那么它们现在就在您当前的名称空间中(不管是什么,如果没有冲突的话) ,您可以像 (bar ...)那样调用它们。
(require 'foo)
(foo/bar ...)
(use 'foo)
(bar ...)
使用 sure 确实使得每次调用函数时不需要拼写名称空间变得更加容易,尽管它也可能因为创建名称空间冲突而使事情变得一团糟。介于“使用”和“需要”之间的一个好的中间立场是,只“使用”您实际使用的名称空间中的函数。
例如:
(use’[ clojure-Contrib. Duck-stream: only (writer reader)))
(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))
在 require和 refer中包含外部函数是惯用的做法。您可以避免名称空间冲突,只包含实际使用/需要的函数,并显式声明每个函数的位置:
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:
only
(ns project.core (:use [ring.middleware.reload :only [wrap-reload]]))
否则,您将包含所有内容,使其成为一个不必要的大型操作,并且使其他程序员很难找到函数所在的位置。
另外,我强烈推荐将 这个博客作为学习更多关于 Clojure 名称空间的资源。