【发布时间】:2021-12-12 04:56:25
【问题描述】:
Clojure Programming中显示的:as的第一个用法如下
(let [[x _ z :as original-vector] v]
(conj original-vector (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]
但是,通过对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]
如果我有一个更复杂的表达式而不是 v,这显然是不可行的(在 C++ 中,我会说 temporary/rvalue,而 v将是一个左值)。
所以我的问题是::as 语法是否仅在我们解构临时对象时有用,而在我们解构命名实体时它完全是多余的?我的意思是在上面的示例中,使用:as 的唯一区别似乎是我们通过另一个名称引用v,但我看不出这有什么好处...
示例假设
(def v [42 "foo" 99.2 [5 12]])
【问题讨论】:
标签: data-binding functional-programming clojure pattern-matching destructuring