161

谁能解释 and 之间的区别userequire无论是直接使用还是作为:useand:requirens宏中使用?

4

4 回答 4

102

require加载库(尚未加载),use做同样的事情,加上它引用它们的命名空间clojure.core/refer(所以你也可以:exclude像 with 一样使用 etc clojure.core/refer)。两者都建议用于ns而不是直接使用。

于 2009-05-16T09:24:49.710 回答
71

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]]))

否则,您将包含所有内容,使其成为不必要的大型操作,并且使其他程序员很难找到函数所在的位置。

另外,我强烈推荐这个博客作为学习更多关于 Clojure 命名空间的资源。

于 2013-05-07T22:23:01.887 回答
36

使用 sure 确实更容易,因为它不需要您在每次要调用函数时都拼出命名空间,尽管它也可能通过创建命名空间冲突而使事情变得一团糟。“use”和“require”之间的一个很好的中间立场是仅“使用”您实际使用的命名空间中的函数。

例如:

(使用 '[clojure-contrib.duck-streams :only (writer reader)])
或者更好的是,在命名空间定义中的文件顶部指定它:

(ns com.me.project
   (:use [clojure.contrib.test-is :only (deftest is run-tests)]))
于 2009-06-20T00:37:08.800 回答
22

正如已经提到的,最大的区别在于(require 'foo),您可以像这样引用 lib 命名空间中的名称:(foo/bar ...)如果这样做,(use 'foo)那么它们现在位于您当前的命名空间中(无论可能是什么,只要没有冲突),您可以调用他们喜欢(bar ...)

于 2009-06-18T04:42:10.403 回答