在Clojure中,我使用以下方式的 :pre:
user=> (defn cannot-take-empty [x] {:pre [((complement empty?) x)]} 1)
#'user/cannot-take-empty
user=> (cannot-take-empty #{})
AssertionError Assert failed: ((complement empty?) x) user/cannot-take-empty (NO_SOURCE_FILE:186)
很好,但这并不能解释为什么在传递空集合时没有商业原因不合理(或者有超过五个元素的集合,或者有两个键存在但另一个不存在的集合,或者任何当天的规则)。如果前提条件使用私有函数,则对用户来说可能更加困惑。
在使用 :pre 和 :post 时,是否有一种提供更有用反馈(如错误消息)给用户的方法?
(defn wrapper [c text] (if (not c) (throw (AssertionError. text))))
,但是这样做并不好。 - soulcheck