我有这样的功能:强制性的Clojure关键字参数
(defn foo [{a :keya b :keyb}]
(list a b))
我打电话这样说:
(foo {:keya "hi"}) ; Returns ("hi" nil)
如果我不给keyb
关键字参数,它需要零为了那个原因。有没有办法确保它为它抛出异常,而不是将它作为零。
(我知道我可以手动检查并抛出一个异常,但有其强制约束的任何特殊选项。)
我有这样的功能:强制性的Clojure关键字参数
(defn foo [{a :keya b :keyb}]
(list a b))
我打电话这样说:
(foo {:keya "hi"}) ; Returns ("hi" nil)
如果我不给keyb
关键字参数,它需要零为了那个原因。有没有办法确保它为它抛出异常,而不是将它作为零。
(我知道我可以手动检查并抛出一个异常,但有其强制约束的任何特殊选项。)
可以使用的前提条件(http://clojure.org/special_forms#toc9)断言,关键是存在:
(defn foo [{a :keya b :keyb}]
{:pre [(not (nil? b))]}
(list a b))
这将在键为零时抛出一个AssertionError。
不,但当然,因为Clojure是一个lisp,你可以自己定义自己的宏来处理无聊的“手动检查”。
如果你想在Validateur或bouncer
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))