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])
但是它们有什么区别,为什么我应该使用其中之一? (特别是在一个导入语句中导入多个类时)
最佳答案
导入
宏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"))
指定向量或列表允许您从同一命名空间导入多个类,使用任一类都是等效的,因为import
利用Clojure的序列抽象来map
并对其进行reduce
。
总结一下:
- 当您只需要命名空间中的单个类时,请使用
(import com.example.db.modules.DBModule)
。 - 在需要时使用
(import [com.example.db.modules DBModule])
或(import (com.example.db.modules DBModule))
导入多个类。我个人更喜欢向量。 - 您可以提供上述项目的任意组合作为
导入
的参数。例如(import com.example.db.modules.DBModule [com.example.model 客户订单付款]))
。 - 不要引用参数,因为没有必要。
关于function - Clojure 中的导入调用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28069871/