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

我试图使用迭代器编写一些Rust代码,但我在双重引用和Rust文档方面遇到了一个问题:

#[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 { .... }