Clojure强制性关键字参数

Sib*_*ibi 3 clojure keyword-argument

我有这样的功能:

(defn foo [{a :keya b :keyb}]
  (list a b))
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

(foo {:keya "hi"}) ; Returns ("hi" nil)
Run Code Online (Sandbox Code Playgroud)

如果我不给出keyb关键字参数,则为零.有没有办法确保它抛出异常,而不是把它作为零.

(我知道我可以手动检查并抛出异常,但是有任何特殊选项可以强制执行约束.)

小智 6

您可以使用前置条件(http://clojure.org/special_forms#toc9)断言密钥存在:

(defn foo [{a :keya b :keyb}] 
   {:pre [(not (nil? b))]}
   (list a b))
Run Code Online (Sandbox Code Playgroud)

当键为nil时,这将抛出AssertionError.