`:as` 绑定是否仅在函数参数是临时参数时才有用?
Is the `:as` binding useful only when the argument to a function is a temporary?
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]])
你说得对,: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])))
然而,值得注意的是,解构的全部力量
可用于函数参数和 let
形式。
示例是使用 my favorite template project 构建的。
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]])
你说得对,: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])))
然而,值得注意的是,解构的全部力量
可用于函数参数和 let
形式。
示例是使用 my favorite template project 构建的。