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
相关产品推荐
相关产品推荐

