使用和要求之间的区别
任何人都可以解释use
和require
之间的差异,直接使用和作为:use
和:require
在ns
macros吗?
require
加载libs(还没有加载), use
相同的加上它指向他们的名字空间与clojure.core/refer
(所以你也可以使用:exclude
等clojure.core/refer
的可能性)。 两者都build议在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
如果你selectuse
,(几乎)总是only
使用。
(ns project.core (:use [ring.middleware.reload :only [wrap-reload]]))
否则,你将所有的东西都包括在内,这使得其他程序员无法进行大量的操作,而且很容易混淆其他程序员的function。
另外,我强烈推荐这个博客作为了解更多关于Clojure命名空间的资源。
确保使用起来更简单一些,不需要在每次调用函数时拼出命名空间,但是也可以通过创build命名空间冲突来弄乱事物。 “use”和“require”之间的一个很好的中间地带是仅仅从实际使用的名字空间中“使用”这些函数。
例如:
(使用'[clojure-contrib.duck-streams:只有(作家读者)])
甚至更好,在名称空间定义的文件顶部指定它:
(ns com.me.project (:use [clojure.contrib.test-is:only(deftest is run-tests)]))
正如已经提到的,与(require 'foo)
有很大的区别,那么你可以在lib的命名空间中引用这样的名字: (foo/bar ...)
如果你这样做(use 'foo)
那么它们现在在你的当前的命名空间(不pipe可能是什么,也没有冲突),你可以把它们称为(bar ...)
。