Clojure:为什么让绑定不能像绑定一样工作?

时间:2018-03-18 19:17:50

标签: clojure

所以,我有clojure.lang.PersistentArrayMap一个密钥,另一个clojure.lang.PersistentArrayMap在内,如:

{:foo {:bar "bar"}}

当我使用for绑定时:

(for [[key value] {:foo {:bar "bar"}}] do-something)

它工作正常,但当我尝试使用let时,它不起作用......

(let [[key value] {:foo {:bar "bar"}}] do-something)

有人可以帮我理解绑定是如何工作的吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

使用for,您可以从所有MapEntry创建一个seq(现在让我们将它们称为key-vals)。 for是列表推导,而不是for循环,因此您要从绑定到输入上的连续值创建一个列表(lazy seq更具体)。 在let中,您不会绑定到连续值,而只绑定到一个值,除非您使用解构,您可以从某个序列中同时提取多个值。

使用let,您只会将第一个和第二个键值绑定到keyvalue,但这不受支持,因为地图没有明确的排序。

然而,使用seq,您可以从地图中获得两个键值:

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

答案 1 :(得分:3)

以下是您的数据示例:

(forv [[key value] {:foo {:bar "bar"}}] ...)
  key   => :foo
  value => {:bar "bar"}


(let [[key value] (first (seq {:foo {:bar "bar"}}))]  ...)
  key   => :foo
  value => {:bar "bar"}

您需要first从序列中抓取一个MapEntry

请注意,如果您只想要第一个seq,则不需要first,因为seq在其内部调用(let [[key value] (first {:foo {:bar "bar"}})] ; same result

picset.replaceAll("\\[\\[\"|\"\\]\\]|", "");
picset.replaceAll("\"\\],\\[\"", "\",\"");