欢迎!有关更多信息,请参阅关于页面。
我没有发现以下表达式的行为有文档说明。请有人指出文档,或者我要求更新文档以警告这个注意事项。请更新文档,以警告此注意事项。
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都应该是一个映射。但实际上,在第一种和第二种情况下是一个映射,在第三种和第四种情况下却是nil。我预期第三种和第四种情况各自评估为一个空映射。
拆解在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]
我会看看指南是否需要在这方面更加明确。