使用和要求之间的差异

Jeg*_*sch 148 clojure

谁能解释之间的差异use,并require直接和使用时:use:requirens宏?

Ale*_*lli 97

require加载libs(尚未加载),use做同样的加上它引用它们的命名空间clojure.core/refer(所以你也有可能使用:exclude像之类的clojure.core/refer).建议两者都使用ns而不是直接使用.

  • 不必协调冲突是一个很好的观点,更普遍的是有一种编程风格,即"名称空间是一个很棒的主意,我们应该有更多的主题"(来自"Python的禅宗") - 所以例如不使用"using namespace foo;" 在C++中,代码的读者和维护者不必担心"这个栏来自哪里",而是看到更明确的foo :: bar.require(vs use)支持这种"显式名称空间"样式. (12认同)
  • 如果我需要lib foo,然后在foo中使用bar,我每次都要写foo/bar,对吧?为什么要在ns中加载lib但是不将它引用到ns?我想你可能会担心碰撞,你不想打扰它们,对吗? (3认同)
  • 亚历克斯给出了一个很好但过时的答案.正如@overthink在下面指出的那样,在给出这个答案之后,惯用的clojure建议要求过度使用.见:http://dev.clojure.org/jira/browse/CLJ-879 (2认同)

rzv*_*rzv 59

require和包含外部函数是惯用的refer.您可以避免命名空间冲突,只包含实际使用/需要的函数,并明确声明每个函数的位置:

(ns project.core
    (:require [ring.middleware.reload :refer [wrap-reload]]))
Run Code Online (Sandbox Code Playgroud)

我不必通过在其命名空间前添加前缀来调用此函数:

(wrap-reload) ; works
Run Code Online (Sandbox Code Playgroud)

如果您不使用refer,则需要在命名空间前面添加前缀:

(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Run Code Online (Sandbox Code Playgroud)

如果您选择use,(几乎)总是使用only:

(ns project.core
    (:use [ring.middleware.reload :only [wrap-reload]]))
Run Code Online (Sandbox Code Playgroud)

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

此外,我强烈推荐此博客作为了解更多有关Clojure名称空间的资源.

  • 看起来http://stackoverflow.com/a/10370672/69689回答了我的问题.简而言之:`(:require ..:refer ..)`是一种新方法,可以让你有效地弃用`:use`,它有一些缺点. (9认同)

Art*_*ldt 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)]))

  • 感谢包括(pun)`(ns ...)`语法; 我一直在寻找,但我找到的所有例子都是为了简单`(使用......)`. (3认同)

Chr*_*ris 18

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