Ale*_*lli 97
require
加载libs(尚未加载),use
做同样的加上它引用它们的命名空间clojure.core/refer
(所以你也有可能使用:exclude
像之类的clojure.core/refer
).建议两者都使用ns
而不是直接使用.
rzv*_*rzv 59
用require
和包含外部函数是惯用的refer
.您可以避免命名空间冲突,只包含实际使用/需要的函数,并明确声明每个函数的位置:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Run Code Online (Sandbox Code Playgroud)
我不必通过在其命名空间前添加前缀来调用此函数:
(wrap-reload) ; works
Run Code Online (Sandbox Code Playgroud)
如果您不使用refer
,则需要在命名空间前面添加前缀:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Run Code Online (Sandbox Code Playgroud)
如果您选择use
,(几乎)总是使用only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Run Code Online (Sandbox Code Playgroud)
否则你将包含所有内容,使其成为一个不必要的大型操作,并且让其他程序员很难找到函数所在的位置.
此外,我强烈推荐此博客作为了解更多有关Clojure名称空间的资源.
Art*_*ldt 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)]))
Chr*_*ris 18
正如已经提到的那样,最大的区别在于(require 'foo)
,你可以在lib的命名空间中引用名称,如下所示:(foo/bar ...)
如果你这样做,(use 'foo)
那么它们现在在你当前的命名空间中(无论可能是什么,如果没有冲突)你可以调用他们喜欢(bar ...)
.