Clojure强制关键字参数
我有这样一个函数:Clojure强制关键字参数,clojure,keyword-argument,Clojure,Keyword Argument,我有这样一个函数: (defn foo [{a :keya b :keyb}] (list a b)) (foo {:keya "hi"}) ; Returns ("hi" nil) 我这样称呼它: (defn foo [{a :keya b :keyb}] (list a b)) (foo {:keya "hi"}) ; Returns ("hi" nil) 如果我不给出keyb关键字参数,那么它需要nil。是否有一种方法可以确保它为其抛出异常,而不是将其视为nil (我知道我
(defn foo [{a :keya b :keyb}]
(list a b))
(foo {:keya "hi"}) ; Returns ("hi" nil)
我这样称呼它:
(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))
当键为nil时,这将抛出断言错误。否,但当然,因为Clojure是一个lisp,您可以定义自己的宏来自动处理枯燥的“手动检查”。如果您想要更复杂的内容,请查看或为您提供了正确的解决方案,但
{: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))