欢迎!请参阅 关于 页面,了解这是如何运作的更多信息。
我没有在文档中找到以下表达式的行为。有人能指出文档的位置吗?或者请更新文档以警告此注意事项。
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 并未明确说明这些情况会发生什么;然而,直观地我以为在所有 4 种情况下 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]
我将看看指南是否需要在此处更清晰。