所以,我有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)
有人可以帮我理解绑定是如何工作的吗? 谢谢!
答案 0 :(得分:3)
使用for
,您可以从所有MapEntry
创建一个seq(现在让我们将它们称为key-vals)。 for
是列表推导,而不是for循环,因此您要从绑定到输入上的连续值创建一个列表(lazy seq更具体)。
在let
中,您不会绑定到连续值,而只绑定到一个值,除非您使用解构,您可以从某个序列中同时提取多个值。
使用let
,您只会将第一个和第二个键值绑定到key
和value
,但这不受支持,因为地图没有明确的排序。
然而,使用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("\"\\],\\[\"", "\",\"");