Edw*_*ard 2 import function clojure difference
Clojure中的以下import语句似乎都是有效的:
(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])
Run Code Online (Sandbox Code Playgroud)
但他们的区别是什么,我为什么要使用其中一个呢?(特别是在一个import-statement中导入多个Classes时)
如果有一个表达式,import宏将删除quote每个表达式,因此引用它从不引用它们的参数之间没有区别.这意味着表达式(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"))
Run Code Online (Sandbox Code Playgroud)
Specifying a vector or a list allows you to import more than one class from the same namespace, using either one is equivalent since import makes use of Clojure's sequence abstraction to map and reduce over them.
To sum up:
(import com.example.db.modules.DBModule) when you need only a single class from a namespace.(import [com.example.db.modules DBModule]) or (import (com.example.db.modules DBModule)) when you need to import more than one class. I personally prefer vectors.import. For example (import com.example.db.modules.DBModule [com.example.model Client Order Payment])).