在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将循环遍历这个向量,并将每个值赋给绑定向量中的var(在这个例子中也是解构)。
这种解构从映射中提取键 :bushido
对应的值,它期望这个值是一个包含两个元素向量的,然后将第一个元素赋值给符号 _
,第二个元素赋值给符号 x
。
for 循环随后返回每个元素的 x
。
这也可以写成这样
user> (map (comp second :bushido) [xbox playstation])
;; => ({:country :notavailable} {:country :japan})
user>
注意,你的 xbox
和 playstation
中的游戏形状不同,因为 :parappa
没有包含其为值的向量。