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!
}