假设我有一个像这样的python函数:
def required(value):
if value is None:
throw Exception
if isintance(value, str) and not value:
throw Exception
return value
基本上我想检查值是否为null。如果值是String,也要检查它是否为空。
做这样的事情的clojure方式是什么?
答案 0 :(得分:5)
在这种情况下,先决条件可以很好地完成。否则使用Clojure的控制流特殊形式/宏,例如if
,cond
throw
。
user=> (defn required
[value]
{:pre [(string? value) (not-empty value)]}
value)
#'user/required
user=> (required nil)
AssertionError Assert failed: (string? value) user/required ...
user=> (required "")
AssertionError Assert failed: (not-empty value) ...
user=> (required "foo")
"foo"
答案 1 :(得分:5)
Clojure做这样的事情的方式是不来抛出异常。惯用的方式是返回nil
而不是其他任何东西。
所以我建议:这样做没有例外。
您的功能将如下所示:
(defn required [value]
(when (string? value)
value))
它检查值的类型,如果它不是String,则返回nil
。否则返回你的价值。
或如果您想在终端中收到错误消息:
(defn required [value]
(if (string? value)
value
(println "Value must be a String.")))
请注意println
打印字符串,然后再次返回nil
。
答案 2 :(得分:4)
先前的答案在断言上都略有错误。 Budi要求的是:
(defn required [value]
(if (or (nil? value)
(and (string? value) (clojure.string/blank? value)))
(throw (Exception.))
value))
答案 3 :(得分:2)
一个。韦伯是正确的,因为先决条件是一种很好的,惯用的方式来代表你在这里要做的事情。
对于它的价值,以下是使用显式异常抛出和cond
ition语句执行相同操作的方法:
(defn required [value]
(cond
(not (string? value))
(throw (IllegalArgumentException. "Value must be a string."))
(empty? value)
(throw (IllegalArgumentException. "String cannot be empty."))
:else
value))
或者,或许更惯用,首先使用when
处理错误,然后在结尾处返回值:
(defn required [value]
(when (not (string? value))
(throw (IllegalArgumentException. "Value must be a string.")))
(when (empty? value)
(throw (IllegalArgumentException. "String cannot be empty.")))
value)