I have a function like this:
(defn foo [{a :keya b :keyb}]
(list a b))
我将它称为这样:
而我这样调用:
(foo {:keya "hi"}) ; Returns ("hi" nil)
如果我不提供keyb
关键字参数,它会将其视为nil。有没有一种方法可以确保它抛出异常而不是将其视为nil。
(我知道我可以手动检查并抛出异常,但是否有任何特殊选项强制执行约束条件。)
I have a function like this:
(defn foo [{a :keya b :keyb}]
(list a b))
而我这样调用:
(foo {:keya "hi"}) ; Returns ("hi" nil)
如果我不提供keyb
关键字参数,它会将其视为nil。有没有一种方法可以确保它抛出异常而不是将其视为nil。
(我知道我可以手动检查并抛出异常,但是否有任何特殊选项强制执行约束条件。)
(defn foo [{a :keya b :keyb}]
{:pre [(not (nil? b))]}
(list a b))
当key为nil时,这将抛出一个断言错误(AssertionError)。
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))