使用和需求之间的区别


Answers:


101

require负载库(即还没有装载),use做同样加上它是指其与命名空间clojure.core/refer(所以你也可以得到使用的可能性:exclude等像clojure.core/refer)。推荐两者都使用ns而不是直接使用。


3
如果我需要lib foo,那么要在foo中使用bar,我每次都必须写foo / bar,对吗?为什么要在ns中加载lib但又不将其引用到ns中?我猜您可能会担心碰撞,而您又不想打扰它们,对吗?
Jegschemesch,2009年

12
不必调和冲突是一个好主意,更普遍的是,有一种编程样式表示“命名空间是一个很棒的主意,我们应该有更多的命名空间”(摘自《 Python的禅宗》),因此例如该样式建议不使用“使用命名空间foo;” 在C ++中,这样代码的阅读者和维护者就不必担心“此栏从何而来”,而可以看到更明确的foo :: bar。require(vs use)支持这种“显式命名空间”样式。
亚历克斯·马蒂利

2
亚历克斯给出了一个很好但过时的答案。正如@overthink在下面指出的那样,在给出此答案后,惯用的clojure建议过度使用。参见:dev.clojure.org/jira/browse/CLJ-879
Phil Cooper

虽然这是公认的且投票最多的答案,但它过时且代表过时的观点。更好的答案是来自@rzv:stackoverflow.com/a/16429572/172272
Didier A.

65

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名称空间的资源。


您知道(:use foo :only [bar])和之间的末尾是否有任何区别(:require foo :refer [bar])?似乎有两种方法可以做到这一点。
凌晨

10
看起来stackoverflow.com/a/10370672/69689回答了我的问题。简而言之:这(:require .. :refer ..)是一种执行相同操作的新方法,可让您有效地弃用:use,这有一些缺点。
考虑过

很好的例子。我喜欢例子,这很有道理。
阿斯特丽德2015年

35

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

例如:

 (使用'[clojure-contrib.duck-streams:only(写作者阅读器)])
甚至更好的是,在名称空间定义的文件顶部指定它:

(ns com.me.project
   (:使用[clojure.contrib.test-is:only(deftest是运行测试)]))

3
感谢您包含(双关)(ns ...)语法;我一直在寻找,但是我发现的所有例子都是简单的(use ...)
paul,2012年

1
更新:现在已经淘汰了此方法,而是推荐使用(require '[namepase :refer [var-name1 var-name2]])
Arthur Ulfeldt 2014年

@ArthurUlfeldt您可能想更新您的答案以包括(双关)。
bfontaine '16

20

如前所述,最大的区别是与(require 'foo),您可以像下面这样引用lib的命名空间中的名称:(foo/bar ...)如果这样做,(use 'foo)则它们现在位于当前的命名空间中(无论存在什么情况,只要没有冲突),就可以调用他们喜欢(bar ...)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.