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])
但它们有什么区别,我为什么要使用其中之一? (尤其是在一个导入语句中导入多个 类 时)
import
宏 removes 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 的序列抽象到 map
和 reduce
在他们之上。
总结一下:
- 当您只需要来自命名空间的单个 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]))
.
- 不要引用参数,因为没有必要。
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])
但它们有什么区别,我为什么要使用其中之一? (尤其是在一个导入语句中导入多个 类 时)
import
宏 removes 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 的序列抽象到 map
和 reduce
在他们之上。
总结一下:
- 当您只需要来自命名空间的单个 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]))
. - 不要引用参数,因为没有必要。