Vector 压缩同一类型的向量会在映射闭包中产生不同的类型

Vector 压缩同一类型的向量会在映射闭包中产生不同的类型,vector,rust,Vector,Rust,背景 给定枚举变量类型(不可复制): enum节点{ Op(函数、框、框), 瓦尔(f64), //其他。。。 } 试图在两个这样的向量上运行操作: 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)

背景

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

enum节点{
Op(函数、框、框),
瓦尔(f64),
//其他。。。
}
试图在两个这样的向量上运行操作:

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!
}
fn应用函数迭代(func:func,lhs:Vec,rhs:Vec)->Vec{
lhs.iter().zip(rhs).map(|(&l,r)| apply_func(func,l,r)).collect()//l和r的声明不同!
}
fn apply_func(func:func,lhs:AstNode,rhs:AstNode)->AstNode{
//魔法就在这里!
}
在闭包中,
lhs
元素采用类型
l:&AstNode
,而压缩的
rhs
元素采用类型
l:AstNode
。(注意闭包元组中的不同声明)

问题

为什么会这样

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

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

免责声明:我对Rust是一个相当陌生的人

该方法没有做任何特殊的事情,它只是将两个迭代器组合在一起。您发现
lhs.iter()
生成一个
Iterator
,而
rhs
生成的
Iterator只借用源代码,因此只能提供对其值的引用。而消费或“拥有”资源,并可以产生自有价值


结合这些,您可以执行
lhs.into_iter().zip(rhs)
来获取值的迭代器
(AstNode,AstNode)
,或者使用
lhs.iter().zip(rhs.iter())
来获取引用的迭代器
(&AstNode,&AstNode)

,您还可以传递对rhs的引用,例如
lhs.iter().zip(&rhs)
,由于
IntoIterator
和返回
&T
迭代器的'a[T]
的全面实现。感谢您对
iter()
into iter()
的深入了解,在阅读相关内容后完全有意义;和+1给出了通过引用同时进行压缩的反向示例。
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!
}