在Clojure 1.4中,require中的refer有什么用途?

73

在Clojure中,:require 中使用 :refer 有什么优势,与在 :use 中使用 :only 相比有何区别?下面两者是同义词吗?

(ns so.example (:use [my.lib :only [function]]))

(ns so.example (:require [my.lib :refer [function]]))
3个回答

84

:refer添加到:require的主要想法是彻底摆脱:use,只留下一个操作符来加载其他包。您可以通过(:require [my.lib :refer :all])来模拟现有的:use...


1
我理解:refer允许我们摆脱:use,但您能否指出证明这是创意的文档?我个人认为,在某些情况下,如与clojure.test一起使用时,:use很方便。为什么不在这种情况下使用:use呢? - Eric Wilson
10
请参阅 http://dev.clojure.org/jira/browse/CLJ-879 并链接至 clojure-dev 邮件列表中的讨论... - Alex Ott

26

是的,它们是等效的。

:refer:require是构建命名空间所必需的基本操作。:use更加方便。

  • :require会导致类被加载
  • :refer将东西添加到名称空间中,这实际上只是一个映射(实际上是几个映射)
  • :use:refer+:require

尽管看起来可能很神奇,但命名空间实际上并没有什么特别之处。

如果你像这样创建一个命名空间

(ns so.example (:use my.lib))

:require 的等效用法是:

(ns so.example (:require [my.lib :refer [function1 function2 function3 
                                         list every function in example 
                                         here and remember to keep it 
                                         up to date ]]))

1
它几乎总是与:as一起使用,以给包提供简短的名称。哦,而且它首先出现了。使用调用:refer,refer不使用:use。 - Arthur Ulfeldt
我仍然不明白为什么要将 :refer 添加到 :require 中。有哪些问题得到了解决,而以前没有解决? - Andrew
16
Andrew,添加:refer:require的主要目的是完全摆脱:use。现在你可以使用 (:require [my.lib :refer :all]) 来模拟 :use... - Alex Ott
@AlexOtt 谢谢。如果您将您的评论作为答案,我会接受它。 - Andrew

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接