2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于页面 以获取更多关于这是如何工作的信息。

+1 投票
 Clojure

我没有在文档中找到以下表达式的行为。
请人指给我看文档,或者我请求
更新文档以警告这一弊端。

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 而不是空映射。

((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 的情况都应该评估为空映射。

1 答案

+2 投票

解构在 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]

我会看看指南是否需要在此处更加清晰。

by
我在那些指南示例中添加了`:as opts`,并展示了它绑定到了什么,包括绑定到nil的“无kwargs”示例。
...