欢迎!请参阅 关于页面 以获取更多关于这是如何工作的信息。
我没有在文档中找到以下表达式的行为。请人指给我看文档,或者我请求更新文档以警告这一弊端。
https://clojure.org/guides/destructuring
((fn [& {:as key-vals}] key-vals) :a 100 :b 200) ;; case 1 (let [[& {:as key-vals}] '(:a 100 :b 200)] key-vals) ;; case 2
这两个都评估为映射 {:a 100 :b 200}。然而,以下评估为 nil 而不是空映射。
{:a 100 :b 200}
nil
((fn [& {:as key-vals}] key-vals) ) ;; case 3 (let [[& {:as key-vals}] ()] key-vals) ;; case 4
标签 https://clojure.org/guides/destructuring#_keyword_arguments 并没有确切说明在这些情况下会发生什么;然而,直观上我预计四种情况下 key-vals 都应该是映射。相反,它们在前两种情况下是映射,但在 3 和 4 情况下是 nil。我预计 3 和 4 的情况都应该评估为空映射。
解构在 https://clojure.org/reference/special_forms#binding-forms 中有文档记载,并在顶部说明“由于数据缺失(例如,序列结构中的元素太少,关联结构中的没有键等)而与各自的组成部分不匹配的绑定形式将绑定到 nil。”
相同的思路
(let [[a b] []] [a b]) ;;=> [nil nil] (let [[& es] []] es) ;;=> nil (let [{:keys [a b], c :c} {}] [a b c]) ;;=> [nil nil nil]
我会看看指南是否需要在此处更加清晰。