Clojure 中的导入调用有什么区别?

What is the difference between import calls in Clojure?

Clojure 中的以下导入语句似乎都是有效的:

(import '(com.example.db.modules DBModule))
(import 'com.example.db.modules.DBModule)
(import '[com.example.db.modules DBModule])
(import (com.example.db.modules DBModule))
(import com.example.db.modules.DBModule)
(import [com.example.db.modules DBModule])

但它们有什么区别,我为什么要使用其中之一? (尤其是在一个导入语句中导入多个 类 时)

importremoves the quote of each expression 如果有的话,那么引用它收到的参数与不引用它们之间没有区别。这意味着表达式 (import 'com.example.db.modules.DBModule))(import com.example.db.modules.DBModule) 是等价的。您可以通过宏扩展每个表达式来检查这一点。

user=> (macroexpand-1 '(import 'com.example.db.modules.DBModule))
(do (clojure.core/import* "com.example.db.modules.DBModule"))
user=> (macroexpand-1 '(import com.example.db.modules.DBModule))
(do (clojure.core/import* "com.example.db.modules.DBModule"))

指定向量或列表允许您从同一个命名空间导入多个 class,使用任何一个都是等效的,因为 import 使用 Clojure 的序列抽象到 mapreduce 在他们之上。

总结一下:

  • 当您只需要来自命名空间的单个 class 时使用 (import com.example.db.modules.DBModule)
  • 当您需要导入多个 class 时,请使用 (import [com.example.db.modules DBModule])(import (com.example.db.modules DBModule))。我个人比较喜欢矢量图。
  • 您可以提供前面各项的任意组合作为 import 的参数。例如 (import com.example.db.modules.DBModule [com.example.model Client Order Payment])).
  • 不要引用参数,因为没有必要。