流控制语句中的clojure方式

时间:2014-03-06 17:48:30

标签: clojure

假设我有一个像这样的python函数:

def required(value):
    if value is None:
        throw Exception
    if isintance(value, str) and not value:
        throw Exception
    return value

基本上我想检查值是否为null。如果值是String,也要检查它是否为空。

做这样的事情的clojure方式是什么?

4 个答案:

答案 0 :(得分:5)

在这种情况下,先决条件可以很好地完成。否则使用Clojure的控制流特殊形式/宏,例如ifcond 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)