使用和要求之间的区别

任何人都可以解释userequire之间的差异,直接使用和作为:use:requirensmacros吗?

require加载libs(还没有加载), use相同的加上它指向他们的名字空间与clojure.core/refer (所以你也可以使用:excludeclojure.core/refer的可能性)。 两者都build议在ns使用,而不是直接使用。

包含requirerefer外部函数是惯用的。 您避免名称空间冲突,您只包括您实际使用/需要的函数,并且您显式声明每个函数的位置。

 (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 ...)