Rust 迭代器筛选器()双引用借用错误
我试图使用迭代器编写一些Rust代码,但我在双重引用和Rust文档方面遇到了一个问题:Rust 迭代器筛选器()双引用借用错误,rust,Rust,我试图使用迭代器编写一些Rust代码,但我在双重引用和Rust文档方面遇到了一个问题: #[derive(PartialEq,Eq)] pub enum Token { ECOND, SCOND } pub fn validate(pgm: &Vec<Token>) -> Result<(), ()> { let valid1 = pgm.iter() .filter(|&&i
#[derive(PartialEq,Eq)]
pub enum Token {
ECOND,
SCOND
}
pub fn validate(pgm: &Vec<Token>) -> Result<(), ()> {
let valid1 = pgm.iter()
.filter(|&&item|
item == Token::SCOND || item == Token::ECOND
)
.fold(0, |acc: i64, ref x| -> i64 {
if x == &&Token::SCOND {
return acc + 1;
} else {
return acc - 1;
}
});
if valid1 != 0 {
return Err(());
}
return Ok(());
}
如所述,通过双重引用,我可以通过以下方式编写代码,并且它可以工作:
.filter(|&item|
*item == Token::SCOND || *item == Token::ECOND
)
也像这样:
.filter(|item|
**item == Token::SCOND || **item == Token::ECOND
)
但是我如何使用我的解决方案(这也是文档解决方案)?我看不出我的错误在哪里。您的
令牌
和文档的i32
之间的主要区别在于i32
是副本
默认情况下,锈蚀类型是仿射类型:它们最多只能使用一次(按值传递)<代码>复制类型是该规则的例外,它们可以被多次使用,因为使用它们不会转移所有权,而是以静默方式生成一个克隆
因此,除非您的标记
类型为复制
(这也需要克隆
),否则您不能使用过滤器
文档中提供的第三种形式
您可以简单地使用:
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Token { .... }
要使其复制
,或不使用第三种形式。我会建议后者,除非你愿意向你的客户保证,它将保持复制
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Token { .... }