验证一个值是一组可能值中的一个的最佳方法是什么?

What's the best way to validate that a value is one of a set of possible values?

在 Clojure 中,验证一个值是一组可能值中的一个的惯用方法是什么?

我最初是这样做的:

(let [size :grande]
  (make-latte (condp = size
                :tall :tall
                :grande :grande)))

以上内容很有用,因为如果没有子句匹配,则会抛出 IllegalArgumentException

但后来我发现这样做更舒服:

(let [size :grande]
  (make-latte (or (some #{:tall :grande} [size])
                  (throw (IllegalArgumentException. "I don't know that size")))

这项技术效果很好,因为它允许更多可能的值,例如

(some #{:short :tall :grande :venti} [size])

最好的方法是什么?我是否认为 clojure.core 没有已经执行此操作的功能?

(some #{:short :tall :grande :venti} [size])

等同于

(#{:short :tall :grande :venti} size)

那是因为集合是函数。对于通用集合,您可以使用 contains?.

编辑:如下 user1571406 注释,请注意 contains? 测试的是键,而不是值。

您可以在 make-latte 函数本身中使用前置条件。参见