首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure Spec依赖字段

Clojure Spec依赖字段
EN

Stack Overflow用户
提问于 2016-12-06 17:21:30
回答 1查看 808关注 0票数 10

我有一个记录,对于这个规范,我想要生成值,但确保当前金额不超过最大值。简化的规范应该是这样的:

代码语言:javascript
复制
(s/def ::max-amt (s/and number? #(<= 0 % 1e30)))
(s/def ::cur-amt (s/and number? #(<= 0 % 1e30)))
(s/def ::loan (s/cat :max-amt ::max-amt
                     :cur-amt ::cur-amt))

我知道我可以在s/and规范中使用::loan,但是我想要这样的东西:

代码语言:javascript
复制
(s/def :loan (s/cat :max-amt ::max-amt
                    ;; not a real line:
                    :cur-amt (s/and ::cur-amt #(< (:cur-amt %) (:max-amt %)))))

这种类型的约束在规范中可用吗?

注意:我知道我可以用一个0到1之间的数字替换cur-amt,这个数字代表小数部分,但是我修改数据以适应代码,而不是相反的方式。我在这里并不控制实际应用程序中的数据源。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 21:03:35

这应该可以工作(改编自这一讨论):

代码语言:javascript
复制
(s/def ::loan (s/and (s/keys :req [::cur-amt ::max-amt])
                     (fn [{:keys [::cur-amt ::max-amt]}]
                       (< cur-amt max-amt))))

(s/conform ::loan {:cur-amt 50 :max-amt 100}) ; => {:cur-amt 50 :max-amt 100}
(s/conform ::loan {:cur-amt 100 :max-amt 50}) ; => :clojure.spec/invalid

或者,如果你想坚持s/cat

代码语言:javascript
复制
(s/def ::loan (s/and (s/cat :cur-amt ::cur-amt
                            :max-amt ::max-amt)
                     (fn [{:keys [cur-amt max-amt]}]
                       (< cur-amt max-amt))))

(s/conform ::loan [50 100]) ; => [50 100]
(s/conform ::loan [100 50]) ; => :clojure.spec/invalid
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41001242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档