any?
的生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价(通过 =
)不兼容,所以不得将根据谓词转换/处理集合的 fn 进行 :ret spec,变得相当有问题。这是因为最明显要检查的情况(谓词对任何值都没有返回 true,因此输出 coll 应该等于输入 coll,因为没有经过转换/处理),不能简单地表达。
在我自己的 specs 中想出的解决方案是用 (s/and any? (complement double-NaN?))
来 spec 集合元素,而不是仅仅使用 any?
,而且它有效。然而,尽管我可以在测试中不考虑 NaN,但我必须承认这仍然有点像变通方法。
想法
1) any?
的生成器可以硬编码为永远不返回 Double/NaN。这似乎相当具有入侵性。
2) any?
的生成器可以进行改进,使其可配置允许/禁止 Double/NaN。然后也许可以通过动态变量和/或宏(例如 without-NaNs
)来公开这一点(这里只是在头脑风暴)。
3) any?
的生成器可以保持不变,但可以添加一个新的等价运算符(例如 clojure.spec/===
),它可以忽略 NaN(例如,一个简单的实现可能会遍历数据结构,将所有 NaN 替换为关键字,然后执行常规比较)。