使用和要求之间的差异

时间:2009-05-16 08:43:03

标签: clojure

任何人都可以解释userequire之间的区别,无论是直接使用还是:use:require中的ns

4 个答案:

答案 0 :(得分:96)

require加载了libs(尚未加载),use执行相同的 plus ,它引用了clojure.core/refer的命名空间(所以你也是有可能使用:excludeclojure.core/refer)。建议两者都使用ns而不是直接使用。

答案 1 :(得分:58)

使用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

如果您选择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 ...)一样调用它们。