【问题标题】:Why does Clojure's map destructuring look reversed?为什么 Clojure 的地图解构看起来是颠倒的?
【发布时间】:2013-12-19 14:05:12
【问题描述】:

在我看来,解构地图看起来是相反的。谁能解释发生了什么?

我希望这是解构地图的正确形式

;=> (让 [{:a a :b b} {:a 1 :b 2}] [a b])

返回Exception Unsupported binding form: :a clojure.core/destructure/pb--4541 (core.clj:4029)。 Clojure 文档说下面是正确的方法。但是看起来键和值是相反的。

这应该是正确的方式:

;=> (让 [{a :a b :b} {:a 1 :b 2}] [a b]) [1 2]

解构地图时发生了什么?

【问题讨论】:

标签: clojure


【解决方案1】:

这并没有真正颠倒过来,实际上它是有道理的。它说:将符号“a”绑定到与关键字关联的值:a

当您的地图使用关键字作为键时,您是否意识到这一点?

(let [{:keys [a b]} {:a 1 :b 2}] [a b])

更加整洁优雅!

如果您的键是符号或字符串,则存在其他变体。

【讨论】:

  • 啊哈,我没有注意到我在使用符号。实际上(def a 1) 的意思是:将1分配给名为“a”的符号?
  • @taro 意思是:绑定到符号 'a' 的值 1
  • @taro 在您的 REPL 中运行(文档相同?)。
  • @taro “Clojure 的乐趣”一书假定您了解 Clojure。最好从“Clojure in Action”或“Clojure Programming”之类的内容开始。
  • 我真的很惊讶 Stuart Halloway 的“Programming Clojure”很少被提及。我认为对于所有有一点编程背景的人来说,这都是一本极好的书。 @taro 破坏地图时会发生什么? clojure.core/destructure 使用绑定向量调用。你可以在这里学习:github.com/clojure/clojure/blob/master/src/clj/clojure/…
【解决方案2】:

此外,它可以区分这些情况:

cljs.user=> (let [{foo :foo :as bar} {:foo 3 :as 4}] [foo bar])
[3 {:foo 3, :as 4}]
cljs.user=> (let [{foo :foo bar :as} {:foo 3 :as 4}] [foo bar])
[3 4]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2017-03-20
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多