【发布时间】:2010-10-26 16:46:33
【问题描述】:
谁能解释use 和require 之间的区别,无论是直接使用还是在ns 宏中作为:use 和:require 使用?
【问题讨论】:
-
另见stackoverflow.com/questions/10358149/…关于ns宏;在 clojure 1.4 中,建议您优先使用 :require 来 :use
标签: clojure
谁能解释use 和require 之间的区别,无论是直接使用还是在ns 宏中作为:use 和:require 使用?
【问题讨论】:
标签: clojure
使用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])最后有什么区别吗?有两种方法可以做到这一点似乎很奇怪。
(:require .. :refer ..) 是一种新方法,可以让您有效地弃用 :use,它有一些缺点。
使用 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]])
正如已经提到的,最大的区别在于 (require 'foo),然后您可以像这样引用 lib 名称空间中的名称:(foo/bar ...) 如果您使用 (use 'foo),那么它们现在位于您当前的名称空间中(无论可能只要没有冲突),你可以像(bar ...)一样称呼他们。
【讨论】:
require 加载库(尚未加载),use 执行相同的操作 plus 它使用 clojure.core/refer 引用它们的命名空间(因此您也可以使用 @ 987654326@ 等与clojure.core/refer 一样)。两者都建议在ns 中使用,而不是直接使用。
【讨论】: