使用和需要的区别
Posted
技术标签:
【中文标题】使用和需要的区别【英文标题】:difference between use and require 【发布时间】:2010-10-26 16:46:33 【问题描述】:谁能解释use
和require
之间的区别,无论是直接使用还是在ns
宏中作为:use
和:require
使用?
【问题讨论】:
另见***.com/questions/10358149/…关于ns宏;在 clojure 1.4 中,建议您优先使用 :require 来 :use 【参考方案1】:使用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]]))
否则,您将包含所有内容,这将导致不必要的大操作,并且让其他程序员很难找到函数所在的位置。
另外,我强烈推荐 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 使用中的区别
HTTP 和 HTTPS 的 REST API 测试有啥区别。使用 RESTassured 测试来测试 HTTPS 需要啥额外的东西