任何人都可以解释use
和require
之间的区别,无论是直接使用还是:use
和:require
中的ns
?
答案 0 :(得分:96)
require
加载了libs(尚未加载),use
执行相同的 plus ,它引用了clojure.core/refer
的命名空间(所以你也是有可能使用:exclude
等clojure.core/refer
)。建议两者都使用ns
而不是直接使用。
答案 1 :(得分:58)
使用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]]))
否则你将包含所有内容,使其成为一个不必要的大型操作,并且让其他程序员很难找到函数所在的位置。
此外,我强烈建议this blog作为了解Clojure名称空间的更多资源。
答案 2 :(得分:33)
确保通过不要求每次要调用函数时拼写出命名空间来确保更容易,尽管它也可以通过创建命名空间冲突来搞乱一切。 “use”和“require”之间的良好中间地带只是“使用”您实际使用的命名空间中的函数。
例如:
(use '[clojure-contrib.duck-streams :only (writer reader)])甚至更好,在命名空间定义中的文件顶部指定它:
(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))
答案 3 :(得分:18)
正如已经提到的那样,与(require 'foo)
有很大区别,你可以在lib的命名空间中引用名称,如果你(foo/bar ...)
那么(use 'foo)
那么它们现在在你的当前命名空间(无论可能是什么,只要没有冲突),您可以像(bar ...)
一样调用它们。