在 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>
我们可以看到它实际上做什么。是的,如其他答案中提到的,这是一个无操作(no-op),因为 for
生成的是一个惰性序列,因此在需要之前实际上并没有做任何工作。在这里进行工作是因为 REPL 想要打印结果,所以惰性序列才会被实现。
至于 for 循环实际上做了什么。我们创建了一个由两个 map xbox
和 playstation
组成的向量。for 将会遍历这个向量,并将每个值分配到绑定向量中的变量(在这里 {[_ x] :bushido}
),这在这种情况下也是一个解构(destructuring)。
这个解构从 map 中提取键 :bushido
的值,它期望这个值是一个有两个元素的向量,然后它将第一个元素分配给符号 _
和第二个元素分配给符号 x
。
然后这个 for 循环对每个元素返回 x
。
这也可以写成这样:
user> (map (comp second :bushido) [xbox playstation])
;; => ({:country :notavailable} {:country :japan})
user>
请注意,您的 xbox
和 playstation
中的游戏形状不相同,因为 :parappa
不包含向量作为其值。