Enr*_*lis 2 data-binding functional-programming clojure pattern-matching destructuring
Clojure 编程:as中显示的第一个用法如下
(let [[x _ z :as original-vector] v]
(conj original-vector (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]
Run Code Online (Sandbox Code Playgroud)
但是,通过在https://rextester.com/l/clojure_online_compiler上进行一些实验,我发现它v在 的正文中可见let,因此我可以跳过:as解构并使用v而不是original-vector,结果是相同的
(let [[x _ z] v]
(conj v (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]
Run Code Online (Sandbox Code Playgroud)
如果我有一个更复杂的表达式而不是v(在 C++ 中我会说是临时/ rvalue,而v将是lvalue),这显然是不可行的。
所以我的问题是::as语法是否仅在我们解构临时对象时有用,而当我们解构命名实体时它完全多余?我的意思是在上面的例子中,使用的唯一区别似乎:as是我们通过另一个名称来引用v,但我不明白这有什么好处......
该示例假设
(def v [42 "foo" 99.2 [5 12]])
Run Code Online (Sandbox Code Playgroud)
你是对的,:as解构技术可能是多余的。然而,:as解构形式几乎总是与函数的参数向量一起使用,而不是与let形式一起使用:
(ns tst.demo.core
(:use tupelo.core tupelo.test))
(defn myfun
[[x _ z :as original-vector]]
(conj original-vector (+ x z)))
(dotest
(is= [1 2 3 4]
(myfun [1 2 3])))
Run Code Online (Sandbox Code Playgroud)
然而,值得注意的是,解构的全部功能可用于函数参数和let形式。
该示例是使用我最喜欢的模板项目构建的。