我在clojure中看到了:use
的几种不同方式 - 什么是惯用/首选方法?
#1
(ns namespace.core
(:use [[something.core]
[another.core]]))
或#2编辑:与:only
结合使用。
(ns namespace.core
(:use [something.core]
[another.core]))
或#3
(ns namespace.core
(:use [something.core
another.core]))
或#4
(ns namespace.core
(:use (something.core
another.core)))
或#5编辑:这是惯用的,但应该像#2中那样使用:use
(ns namespace.core
(:use something.core
another.core))
答案 0 :(得分:8)
选择#5是惯用的,除非您传递其他选项,例如:only,:exclude等。Colin's blog post详细介绍了选项。
用于处理命名空间的API不必要地学习。然而,它肯定能够用于各种各样的用途,因此重写的压力尚未达到任何人的沸点。
答案 1 :(得分:4)
实际上,这些都不是惯用的。您应该始终在:uses中使用:only子句。你最好的选择是:只增加到#2。如果您不想枚举从另一个命名空间中获取的所有变量,请考虑(:require [foo.bar:as bar])。
值得注意的是,我们应该提到的是 (:use(clojure set xml))语句被认为是混杂操作 因此气馁。 [...]组织你的时候 代码名称中的代码,最好只导出和导入那些代码 需要的元素。
- 来自Clojure的喜悦,第183页。
一个例外是测试命名空间应该使用它测试的命名空间。
答案 2 :(得分:2)
案例1,3和4无效并抛出一些异常。我没见过2 - 只与:only
等结合使用。
(ns namespace.core
(:use
[something.core :only (x)]
another.core))
我通常使用5。
答案 3 :(得分:0)
在Clojure 1.4+中,我根本不会使用use
。 require
可以执行use
现在可以执行的所有操作,因此请忘记use
。少担心一件事。
如果您想要use
- 就像行为(仍然是糟糕的形式,imo),您可以这样做:
(ns namespace.core
(:require
[something.core :refer :all]
[another.core :refer :all]))
如果您想要:use .. :only
行为,请使用:
(ns namespace.core
(:require
[something.core :refer [foo bar]]
[another.core :refer [quux]]))
更多细节:In Clojure 1.4 what is the use of refer within require?