我对Clojure中require
和import
的范围感到有些困惑。我可以以某种方式要求只保留在函数范围内的依赖项吗?
当我执行以下操作时,我会收到显示的错误。
user=> (defn test1 [x] (require '[taoensso.timbre :as timbre]) (timbre/log x))
CompilerException java.lang.RuntimeException: No such namespace: timbre, compiling:(/tmp/form-init1203922056301029971.clj:1:57)
答案 0 :(得分:4)
我不确定您将require
声明移出ns
声明的动机。 require
语句表示该命名空间的依赖关系。
如果这些依赖关系仅与命名空间的某些函数相关,那么您可以考虑将这些函数移动到不同的命名空间中,从而释放第一个依赖关系命名空间,并创建更松散的耦合。
答案 1 :(得分:3)
不,这些只是用于ns
表单。
答案 2 :(得分:1)
我不同意Grav的建议 - 这是一个选项 - 但是我没有看到加载依赖项只能用于一个函数的缺点。
偶尔有理由使用ns
或in-ns
临时切换文件中的命名空间:
(ns foo.bar)
... more code here ...
(ns foo.parameters [:require foo.baz :as bz])
(def my-parm (bz/inc2 42))
(ns foo.bar)
您可以使用它来暂时使require
d名称空间可用,但这通常应该避免。
与许多人一样,Colin Jones' blog post是我最喜欢的名称空间介绍。