我有一个包含参考资料的集合。引用由被调用的函数生成。如果引用不同,那么如何比较预期的集合和实际的集合,即使值是相同的?
这是一个更普遍的问题的特例。如何执行部分匹配,标记某些元素,表明完全匹配是不必要的?
这个问题的要点与测试有关。我有一个函数,返回一个包含引用的表单,我想比较一下它是否符合我的预期。
根据评论意见:
我做过这个..。
(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)}})这给了我一个匹配。
推荐信?谓词来自我们如何测试某物是否是一个参考?
发布于 2014-06-30 20:59:48
按照设计,这不能像您所描述的那样在clojure中完成。您可以通过遍历结构并在所有可变类型上调用deref来生成一个值来进行比较,从而获得类似的效果。正如Rich在这段视频中很好地解释的那样(特别是24分钟)
在某些时候,两个值相等是没有意义的。如果语言允许这样做的话,那么它就会失去将精力集中在使用可模仿的值编程上所获得的大部分力量。也许,如果您将集合放在ref中而不是集合中的ref中,那么就更容易进行推理了?
https://stackoverflow.com/questions/24497174
复制相似问题