我有一个包含参考的集合。引用由被调用函数生成。如果参考值不同,我如何比较预期和实际集合,即使值相同?
这是一个更普遍问题的特例。 如何执行部分匹配,标记某些元素表明不需要完全匹配?
这个问题的重点与测试有关。 我有一个函数返回一个包含引用的表单,我想比较它,看它是否符合我的预期。
基于评论:
我做到了......
(defprotocol Ireference? (reference? [this]))
(extend-type java.lang.Object Ireference? (reference? [this] false))
(extend-type nil Ireference? (reference? [this] false))
(extend-type clojure.lang.Ref Ireference? (reference? [this] true))
(extend-type clojure.lang.Agent Ireference? (reference? [this] true))
(defn ref->str
"takes an arbitrary tree and replaces all futures
with agnostic strings."
[form]
(clojure.walk/postwalk #(if (reference? %) (list 'ref @%) %) form))
我想要的是什么。
(expect '{:foo (ref :bar) :baz {:zoo (ref :awk)}}
(ref->str {:foo (ref :bar) :baz {:zoo (ref :awk)}})
这给了我一个匹配。
答案 0 :(得分:3)
按照设计,这不能像你所描述的那样在clojure中完成。您可以通过遍历结构并在所有可变类型上调用deref
来生成可以进行比较的值,从而获得类似的效果。 Rich Hickey在this video(特别是24分钟)
两个值仅在某些时间相等是没有意义的。如果语言允许这样做,那么通过专注于使用可模拟值进行编程,它将失去很多力量。也许如果你将集合放在ref而不是集合中的ref中,事情会更容易推理出来吗?