我有這樣的功能:強制性的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))