Clojure 强制关键字参数

3

I have a function like this:

(defn foo [{a :keya b :keyb}]
  (list a b))

我将它称为这样:

而我这样调用:

(foo {:keya "hi"}) ; Returns ("hi" nil)

如果我不提供keyb关键字参数,它会将其视为nil。有没有一种方法可以确保它抛出异常而不是将其视为nil。

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

4个回答

6
你可以使用前置条件 (http://clojure.org/special_forms#toc9) 来断言键是否存在:
(defn foo [{a :keya b :keyb}] 
   {:pre [(not (nil? b))]}
   (list a b))

当key为nil时,这将抛出一个断言错误(AssertionError)。


2

aldazosa 给出了正确的解决方案,但是 {:keya nil :keyb nil} 也是一个有效的映射。如果允许 nil 值,您可以使用 contains? 而不是 nil? 检查:

(defn foo [{a :keya b :keyb :as m}]
  {:pre [(every? (partial contains? m)
                 [:keya :keyb])]}
  (list a b))

2
不,但由于Clojure是Lisp,你可以定义自己的宏来自动处理无聊的“手动检查”工作。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接