{{clojure.spec/double-in}} 定义了一个测试是否一个双精度数大于等于最小值和小于等于最大值的规范。从数学和实际应用的角度来看,这似乎是一个任意的选择。有时,你需要测试一个双精度数是否大于最小值或小于最大值。例如:应用将在稍后对测试的双精度数进行除法操作。
当然,我们可以向 {{double-in}} 添加测试,例如
(s/and (s/double-in :min 0.0 :max 1.0) #(not= 0.0 %)))
但
`
(and (> % 0.0) (<= % 1))
`
如果不执行 {{double-in}} 的 {{NaN}} 和 {{Infinity}} 测试,可能会更清晰。
为什么不有一个供所有四个区间测试使用的公共接口?而不是四个不同的规范函数,这可能是另一个选择,我建议向 {{double-in}} 添加两个关键字。当这些关键字为 true 时,它们会将 >= 或 <= 测试更改为 > 或 < 测试。
{{:min-greater}}
(豁免? :min+, :min-greater-than, :greater-than-min, :strict-min, :min-open,或者可能是 :infinmum, :inf,但这可能具有误导性)
{{:max-less}}
(或者 :max- :max-less-than, :less-than-max, :strict-max, :max-open,或者可能 :supremum, :sup 等.)
例如,
(s/valid? (s/double-in :min 0.0 :max 0.1 :min-greater true) 0.0)
将返回 {{false}},但
(s/valid? (s/double-in :min 0.0 :max 0.1 :min-greater false) 0.0)
将返回 {{true}}。
这些关键字的默认值可能应该是 false,以保持与 {{double-in}} 当前定义的兼容性。