如果您尝试解构的键不在传递给函数的映射中,有没有办法引发异常?这对宏来说是一个很好的用例吗?
例如:(defn x [{:keys [a b]}] (println a b))
我希望这个工作:(x {:a 1 :b 2})
但这会引发异常(缺少:b)(x {:a 1})
最佳答案
pre-condition 怎么样?
(defn x [{:keys [a b]}]
{:pre [(some? a) (some? b)]}
(println a b))
user=> (x {:a 1})
AssertionError Assert failed: (some? b) user/x (NO_SOURCE_FILE:1)
编辑:是的,您可以使用宏为您处理此问题。也许是这样的:
(defmacro defnkeys [name bindings & body]
`(defn ~name [{:keys ~bindings}]
{:pre ~(vec (map #(list 'some? %) bindings))}
~@body))
(defnkeys foo [a b]
(println a b))
(foo {:a 1 :b 2})
(foo {:a 1}) ;; AssertionError Assert failed: (some? b)
(foo {:a 1 :b nil}) ;; AssertionError Assert failed: (some? b)
关于clojure - 解构时需要的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29928602/