我想知道是否有办法通过索引来构造向量。基本上,这是一种允许我避免的简写:
(defn f [v]
(let [x (nth v 4)
y (nth v 5)]
(println x y)))
这是我的基本问题:
user=> (defn f [{x 4 y 5}] (println x y))
#'user/f
user=> (f [0 1 2 3 4 5 6])
4 5
nil
user=> (f (apply vector (range 10)))
4 5
nil
user=> (f (range 10))
5 nil
nil
user=>
答案 0 :(得分:8)
向量是关联的,因此您可以使用关联解构:
(let [{x 4 y 5} [0 1 2 3 4 5 6]]
[x y])
;= [4 5]
回应下面的评论,这适用于任何解构表单的工作,包括在fn
参数列表中:
((fn [{x 4 y 5}] [x y]) [0 1 2 3 4 5 6])
;= [4 5]
如果将seq传递给上面定义的函数代替向量,则将应用seqs的关联解构规则。也就是说,seq将首先被倒入哈希映射 - (range 10)
在此阶段变为{0 1 2 3 4 5 6 7 8 9}
- 然后这个哈希映射将被解构为地图。
无法通过索引对seq进行解构。这是设计使然,因为seqs不适用于需要快速随机访问的应用程序。