Kev*_*vin 3 clojure destructuring
我想知道是否有办法通过索引来构造向量.基本上,这是一种允许我避免的简写:
(defn f [v]
(let [x (nth v 4)
y (nth v 5)]
(println x y)))
Run Code Online (Sandbox Code Playgroud)
这是我的基本问题:
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=>
Run Code Online (Sandbox Code Playgroud)
向量是关联的,因此您可以使用关联解构:
(let [{x 4 y 5} [0 1 2 3 4 5 6]]
[x y])
;= [4 5]
Run Code Online (Sandbox Code Playgroud)
回应下面的评论,这适用于任何解构表单的工作,包括在fn参数列表中:
((fn [{x 4 y 5}] [x y]) [0 1 2 3 4 5 6])
;= [4 5]
Run Code Online (Sandbox Code Playgroud)
如果将seq传递给上面定义的函数代替向量,则将应用seqs的关联解构规则.也就是说,seq将首先被倒入哈希映射 - (range 10)变为{0 1 2 3 4 5 6 7 8 9}此阶段 - 然后该哈希映射将被解构为地图.
没有办法按索引对seqs进行解构.这是设计使然,因为seqs不适用于需要快速随机访问的应用程序.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |