gpt4 book ai didi

data-binding - 仅当函数的参数是临时参数时, `:as` 绑定(bind)才有用吗?

转载 作者:行者123 更新时间:2023-12-02 01:55:00 28 4
gpt4 key购买 nike

:as 的第一次用法如 Clojure Programming 所示如下

(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 上进行一些实验,我看到 vlet 的主体中可见,所以我可以跳过 :as 解构并使用 v 而不是 original-vector,结果是一样的

(let [[x _ z] v]
(conj v (+ x z)))
;= [42 foo 99.2 [5 12] 141.2]

如果我有一个更复杂的表达式而不是 v,这显然是不可行的(在 C++ 中,我会说临时/右值 ,而 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 构建的.

关于data-binding - 仅当函数的参数是临时参数时, `:as` 绑定(bind)才有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69729525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com