在REPL中运行这段代码
user> (def xbox {:bushido ["only on PS" {:country :notavailable}]
:parappa "only on PS" :oni "only on PS"})
;; => #'user/xbox
user> (def playstation {:bushido ["available" {:country :japan}]
:parappa "classic" :oni "need to play"})
;; => #'user/playstation
user> (for [{[_ x] :bushido} [xbox playstation]]
x)
;; => ({:country :notavailable} {:country :japan})
user>
我们可以看到这实际上做了什么。是的,就像其他回答中提到的,这是一个无操作,因为for生成了一个惰性序列,所以在需要之前其实是没有做任何工作的。工作在这里完成是因为REPL想打印结果,因此惰性序列被实现了。
至于for循环到底做了什么。我们制作了两个映射xbox和playstation的向量。for将遍历这个向量,并将每个值赋给绑定向量这里的变量({[_ x] :bushido}
),在这个例子中它也是一个解构。
这种解构接受一个映射并提取键:bushido
下的值,然后期望它是一个包含两个元素的向量,将第一个元素赋给符号_
,将第二个元素赋给符号x
。
for循环然后为每个元素返回x
。
这同样也可以写成
user> (map (comp second :bushido) [xbox playstation])
;; => ({:country :notavailable} {:country :japan})
user>
请注意,您的 xbox
和 playstation
游戏形状不同,因为 :parappa
的值不包含矢量。