生成器覆盖在多特派上无法按预期工作。
下面的代码示例说明了问题。
{代码:无}
(s/def ::obj-type #{:a :b})
(s/def ::base-obj (s/keys :req [::obj-type]))
(defmulti obj-type ::obj-type)
(defmethod obj-type :a [_]
::base-obj)
(defmethod obj-type :b [_]
::base-obj)
(s/def ::obj (s/multi-spec obj-type ::obj-type)))
{代码:无}
(gen/sample (s/gen ::obj {::obj-type #(gen/return :a)}))
在上面的示例中,多特派的多特派函数 *::obj-type* 给定了一个生成器覆盖。
期望只返回 *{::obj-type :a}* 的集合。
实际上,它也会返回 *{::obj-type :b}.*
这是一个生成器不能用来限制从中进行采样的特派键集合。
h2. 当前方法
在多特派的情况下,对于每个可能的特派值,都会构建一个生成器。
然后随机选择一个,而不考虑对特派函数(键)的覆盖。
h2. 修补的方法
提交可用[这里|
https://github.com/bonega/spec.alpha/commit/9cb42478b52eac275d496ec29669e2bf4b3e8e1f]
修补版按照原样为特派值构建生成器。
之后,检查是否存在对特派函数的覆盖。
如果有的话,使用覆盖生成器进行gen/bind。
bind函数从覆盖生成器生成一个值。
该值然后用于查找并返回正确的多特派生成器。
[测试案例|
https://pastebin.com/62ZT5Zfc]