gpt4 book ai didi

vector - 压缩相同类型的向量会导致 map 闭包中的不同类型

转载 作者:行者123 更新时间:2023-12-03 11:27:36 24 4
gpt4 key购买 nike

背景

给定枚举变体类型(不可复制):

enum AstNode {
Op(Func, Box<AstNode>, Box<AstNode>),
Val(f64),
// others...
}

尝试对两个这样的向量运行一个操作:

fn apply_func_iterative(func: Func, lhs: Vec<AstNode>, rhs: Vec<AstNode>) -> Vec<AstNode> {
lhs.iter().zip(rhs).map(|(&l,r)| apply_func(func,l,r)).collect() // l and r are declared differently!
}

fn apply_func(func: Func, lhs: AstNode, rhs: AstNode) -> AstNode {
// magic happens here!
}

在闭包中,lhs 元素采用 l: &AstNode 类型,而压缩的 rhs 元素采用 l: AstNode。 (注意闭包元组中的不同声明)。

问题

为什么会这样?

有没有办法通过值而不是引用来迭代向量的元素?从观察到的压缩元素的行为来看,这似乎是可能的。

(在这个例子中,这种差异导致语法声明有点奇怪,但在实践中,我在将引用变量传递给函数时遇到了借用检查器)

免责声明:我是 Rust 的新手

最佳答案

Iterator::zip 方法没有做任何特别的事情,它只是组合两个迭代器。你会发现 lhs.iter()产生 Iterator<&AstNode>同时 rhs产生 Iterator<AstNode> ( & 对比非 &)。

Is there a way to iterate elements of a vector by value instead of by reference? It would seem this is possible from the observed behavior of the zipped elements.

是的,有一种方法可以控制这种行为。关键是要注意 zip()的论点 rhs必须实现 IntoIterator特征。在内部,zip()会调用rhs.into_iter()从中获取迭代器。常规行为是 .iter() 借用 来源,因此只能提供对其值的引用。同时 .into_iter() 消耗“取得所有权” 源并且可以产生拥有的值。

结合这些,你可以做到lhs.into_iter().zip(rhs)获取值的迭代器 (AstNode, AstNode)或使用 lhs.iter().zip(rhs.iter())获取引用的迭代器 (&AstNode, &AstNode) .

关于vector - 压缩相同类型的向量会导致 map 闭包中的不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63430898/

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