Clojure 使用与需求的区别

Clojure 使用与需求的区别,clojure,Clojure,有人能解释一下直接使用和作为:在ns宏中使用和:require之间的区别吗?require加载lib(尚未加载的),use也做了同样的事情,另外它使用clojure.core/refere引用它们的名称空间(因此您也可以使用:排除等,就像使用clojure.core/refere)。推荐在ns中使用,而不是直接使用。如前所述,最大的区别是使用(require'foo),然后在lib的名称空间中引用名称,如下所示:(foo/bar…如果使用(use'foo),则它们现在位于当前名称空间中(不管是什

有人能解释一下直接使用和作为
:在
ns
宏中使用
:require
之间的区别吗?

require
加载lib(尚未加载的),
use
也做了同样的事情,另外它使用
clojure.core/refere
引用它们的名称空间(因此您也可以使用
:排除
等,就像使用
clojure.core/refere
)。推荐在
ns
中使用,而不是直接使用。

如前所述,最大的区别是使用
(require'foo)
,然后在lib的名称空间中引用名称,如下所示:
(foo/bar…
如果使用
(use'foo)
,则它们现在位于当前名称空间中(不管是什么,只要不存在冲突)您可以像调用
(bar…

一样调用它们。Use-sure确实让它变得更容易,因为它不需要您在每次调用函数时都详细说明名称空间,尽管它也会因为创建名称空间冲突而造成混乱。在“使用”和“require”是指仅“使用”您实际使用的命名空间中的函数。 例如: (use '[clojure-contrib.duck-streams :only (writer reader)]) (使用“[clojure-contrib.duck-streams:仅限(编写器-读取器)]) 或者更好,在名称空间定义的文件顶部指定它:

(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)])) (ns com.me.project) (:使用[clojure.contrib.test-is:only(deftest是运行测试)])
使用
require
refere
包含外部函数是一种习惯做法。这样可以避免名称空间冲突,只包含实际使用/需要的函数,并明确声明每个函数的位置:

(ns project.core
    (:require [ring.middleware.reload :refer [wrap-reload]]))
我不必通过在函数前面加上名称空间来调用该函数:

(wrap-reload) ; works
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
如果不使用
refere
,则需要在其前面加上名称空间:

(wrap-reload) ; works
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
如果您选择使用
而不是
,(几乎)总是只使用

(ns project.core
    (:use [ring.middleware.reload :only [wrap-reload]]))
否则,您将包括所有内容,这使得它不仅是一个不必要的大操作,而且对于其他程序员来说,查找函数所在的位置非常混乱


另外,我强烈建议将其作为学习Clojure名称空间更多信息的资源。

如果我需要lib-foo,那么要在foo中使用bar,我每次都必须编写foo/bar,对吗?为什么您希望在ns中加载lib,但不将其引用到ns中?我想您可能会担心冲突,并且不想费心协调不必协调冲突是一个很好的观点,更普遍的是,有一种编程风格说“名称空间是一个非常好的主意,我们应该有更多的名称空间”(来自“Python的禅宗”)——因此,这种风格建议不要使用“使用名称空间foo;在C++中,代码的读者和维护者不必担心“这个条目来自何处”,而是看到一个更明确的Fo:::Bar。style.Alex给出了一个很好但过时的答案。正如@overthink在下面指出的,在给出这个答案后,clojure建议需要过度使用。请参阅:虽然这是公认的、投票最多的答案,但它很旧,代表了一种过时的观点。更好的答案来自@rzv:感谢您(双关语)包含
(ns…)
语法;我一直在寻找它,但我找到的所有示例都是针对普通的
(使用…
)。更新:这种方法现在已经被淘汰,取而代之的是
(需要“[namepase:refere[var-name1 var-name2]”)
@arthurlfeldt您可能希望更新您的答案以包括(双关语)这一点。关于ns宏,请参见;在clojure 1.4中,建议您使用:require by preference to:use您知道
(:use foo:only[bar])和
(:require foo:reference[bar])
之间的结尾是否有任何区别吗?有两种方法来实现这一点似乎有些奇怪。看起来像是回答了我的问题。简言之:
(:require.:reference.)。