any?
生成器偶尔会返回 Double/NaN 值。由于 NaN 与等价性(通过 =
)不兼容, retrievable spec'ing 一个根据谓词转换/处理集合的函数就变得相当有问题。因为最常见的检查情况(谓词对任何值都没有返回 true,因此输出集合应该等于输入集合,因为没有进行转换/处理),无法简单地表达。
我在自己的 spec 中想出一个解决方案,即将集合的元素指定为 (s/and any? (complement double-NaN?))
而不是只是 any?
,并且它 works。然而,尽管我可以在测试中不必担心 NaN,但我必须承认这仍然有些/YYYY/笨拙。
想法
1) any?
生成器可以硬编码为从不返回 Double/NaN。听起来相当侵入式。
2) any?
生成器可以被重新设计以对其进行配置,允许/禁止 Double/NaN。然后可能使用动态变量和/或宏(例如 without-NaNs
)来公开这一点(此处仅进行头脑风暴)。
3) any?
生成器可以保持原样,但可以添加一个新的等价性运算符(例如 clojure.spec/===
),它可以忽略 NaN(例如,一个简化的实现可能会遍历数据结构并将所有 NaN 替换为关键词,然后再执行常规比较)。