使用和需要的区别

Posted

技术标签:

【中文标题】使用和需要的区别【英文标题】:difference between use and require 【发布时间】:2010-10-26 16:46:33 【问题描述】:

谁能解释userequire 之间的区别,无论是直接使用还是在ns 宏中作为:use:require 使用?

【问题讨论】:

另见***.com/questions/10358149/…关于ns宏;在 clojure 1.4 中,建议您优先使用 :require 来 :use 【参考方案1】:

使用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 命名空间的资源。

【讨论】:

你知道(:use foo :only [bar])(:require foo :refer [bar])最后有什么区别吗?有两种方法可以做到这一点似乎很奇怪。 看起来***.com/a/10370672/69689 回答了我的问题。简而言之:(:require .. :refer ..) 是一种新方法,可以让您有效地弃用 :use,它有一些缺点。 很好的例子。我喜欢例子,这很有意义。【参考方案2】:

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

例如:

(使用 '[clojure-contrib.duck-streams :only (writer reader)]) 或者更好的是,在命名空间定义中的文件顶部指定它: (ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))

【讨论】:

感谢您包含(双关语)(ns ...) 语法;我一直在寻找,但我找到的所有示例都是针对普通的 (use ...) 更新:这个方法现在已经过时了,取而代之的是(require '[namepase :refer [var-name1 var-name2]]) @ArthurUlfeldt 您可能想更新您的答案以包括(双关语)这个。【参考方案3】:

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

【讨论】:

【参考方案4】:

require 加载库(尚未加载),use 执行相同的操作 plus 它使用 clojure.core/refer 引用它们的命名空间(因此您也可以使用 @ 987654326@ 等与clojure.core/refer 一样)。两者都建议在ns 中使用,而不是直接使用。

【讨论】:

如果我需要 lib foo,那么要在 foo 中使用 bar,我每次都必须写 foo/bar,对吗?为什么要在 ns 中加载一个库,但又不将其引用到 ns 中?我猜你可能会担心冲突,你不想费心去协调它们,对吧? 不必协调冲突是一个好点,更一般地说,有一种编程风格说“命名空间是一个很棒的主意,我们应该有更多”(来自“Python之禅” ) -- 所以例如该风格建议不要使用“使用命名空间 foo;”在 C++ 中,这样代码的读者和维护者就不必担心“这个 bar 是从哪里来的”,而是看到一个更明确的 foo::bar。 require (vs use) 支持这种“显式命名空间”样式。 Alex 给出了一个很好但过时的答案。正如@overthink 在下面指出的那样,在给出这个答案之后,惯用的clojure 建议需要过度使用。见:dev.clojure.org/jira/browse/CLJ-879 虽然这是被接受且投票率最高的答案,但它已经过时并且代表了一种过时的观点。更好的答案是来自@rzv:***.com/a/16429572/172272

以上是关于使用和需要的区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 和 Oracle 在 MyBatis 使用中的区别

HTTPS和SSH方式的区别和使用

HTTP 和 HTTPS 的 REST API 测试有啥区别。使用 RESTassured 测试来测试 HTTPS 需要啥额外的东西

watch和computed区别 及二者使用场景

windows中LIB和DLL的区别与使用

Java中IO与NIO的区别和使用场景