我目前正在开始制作一个工具,该工具应该修改另一个名称空间中的所有功能,并在该(其他)名称空间中运行“ main”功能。几乎就像在单元测试中嘲笑一样,只是出于另一个目的。第一步是从另一个名称空间重新定义函数。第一个清单显示了有效的代码,在此我明确命名了要替换的函数。
(ns one)
(defn a-fun []
(println "original"))
(defn caller []
(a-fun))
(ns two)
(with-redefs [one/a-fun #(println "replaced")]
(one/caller))
;; replaced
;; nil
下一步是从另一个名称空间以编程方式获取函数。这是我碰壁的地方。我已经做了很多尝试ns-publics
,但是到目前为止还没有运气。因此,我尝试将问题分解。问题是该功能的替换不起作用。输出应打印“已替换”而非“原始”。
(ns two)
(def target (ns-resolve 'one (symbol "a-fun")))
(def caller (ns-resolve 'one (symbol "caller")))
(with-redefs [target #(println "replaced")]
(caller))
;; original
;; nil
现在,#'two/target
展示了#'one/a-fun
我在repl中对其进行评估的过程。我可以one/a-fun
通过输入((ns-resolve 'one (symbol "a-fun")))
repl来打电话,所以我不知道哪个部分不起作用。
今天,我已经阅读了许多文档,但实际上并没有什么距离。
您可以这样尝试使用with-redefs-fn
:
(defn p [] "old")
(with-redefs-fn
{(ns-resolve *ns* 'p) #(println "new")}
(fn []
(p)))
;; => new
这确实意味着的主体with-redefs-fn
必须是使用您重新定义的Vars的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句