You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust自定义struct无法使用==运算符的报错原因及解决方法

Rust自定义结构体比较报错问题解析

代码示例

use rand::seq::SliceRandom;
use std::ops::Range;

struct Stack {
    settings: bool
}

fn generate_random_value(number: u8, cards: &mut Vec<Stack>) -> Vec<&Stack> {
    let mut overflow = vec![];
    let pos: usize = 2;
    for _ in (Range { start: 0, end: number } ) {
        let card = cards.choose(&mut rand::thread_rng()).unwrap();
        overflow.push(card);
        let elem = cards.iter().position(|&x| &x == card).unwrap();
    };
    return overflow
}

fn main() {
    let stack_one = Stack {
        settings: true
    };

    let stack_two = Stack {
        settings: false
    };

    let mut vector = vec![stack_one, stack_two];
    let _gen_num = generate_random_value(2, &mut vector);
}

报错信息

运行时触发错误:binary operation == cannot be applied to custom struct

报错原因

虽然代码里写的是&x == card,看起来是两个&Stack引用比较,但Rust会自动对引用进行解引用,实际是在比较两个Stack结构体实例。Rust中自定义结构体默认没有实现PartialEq trait,编译器不知道如何判断两个Stack是否相等,因此抛出该错误。

解决方法

方法1:自动推导实现PartialEq

如果结构体的所有字段都实现了PartialEq(比如本例中的bool类型),可以直接给结构体添加#[derive(PartialEq)]注解,让编译器自动生成比较逻辑:

#[derive(PartialEq)]
struct Stack {
    settings: bool
}

方法2:手动实现PartialEq

如果需要自定义比较规则,可以手动实现PartialEq trait:

impl PartialEq for Stack {
    fn eq(&self, other: &Self) -> bool {
        // 自定义比较逻辑,示例为比较settings字段
        self.settings == other.settings
    }
}

额外优化:避免不必要的索引查找

原代码中用choose获取元素引用后再调用position查找索引的逻辑冗余,可以直接使用choose_index获取随机元素的索引,避免比较操作:

fn generate_random_value(number: u8, cards: &mut Vec<Stack>) -> Vec<&Stack> {
    let mut overflow = vec![];
    let mut rng = rand::thread_rng();
    for _ in 0..number {
        if let Some(idx) = cards.choose_index(&mut rng) {
            let card = &cards[idx];
            overflow.push(card);
            // 直接使用idx变量即可,无需再查找位置
        }
    }
    overflow
}

内容的提问来源于stack exchange,提问作者fish0fqwerty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:33:30