验证一个值是一组可能值中的一个的最佳方法是什么?
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
函数本身中使用前置条件。参见
在 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
函数本身中使用前置条件。参见