gpt4 book ai didi

rust - 如何将结构方法中的 &self 与另一个结构进行比较

转载 作者:行者123 更新时间:2023-11-29 08:22:36 25 4
gpt4 key购买 nike

我不确定为什么,但我的方法不起作用,有没有办法将 self 与其父结构进行比较?我为上下文添加了数据结构。

#[derive(PartialEq, Copy, Clone, Debug)]
enum Suits {
Hearts,
Spades,
Clubs,
Diamonds,
}

#[derive(PartialEq, Copy, Clone, Debug)]
struct Card {
card_num: u8,
card_suit: Suits,
}



fn match_card(&self, deck: &[Option<Card>]) -> bool {
for i in deck.iter() {
match i.unwrap() {
self => {
println!("\nFound card in deck!\nCard found is {:#?}\n", i.unwrap());
return true;
}
_ => continue,
}
}
false
}

我得到:

`self` value is a keyword and may not be bound to variables or shadowed

最佳答案

match语句将提供的值与模式 匹配。将值与模式匹配不同于测试相等性。如果后者是您想要做的,请使用 if声明代替。您可以阅读 subsection on pattern syntax in the book 中的模式.

仅由标识符组成的模式,例如 x , 匹配提供的任何值,并且此值分配x .这意味着模式 self不将该值与 self 的值进行比较,而是尝试将匹配表达式的值分配给 self ,这是不允许的,如错误消息所述。

你的函数应该这样写:

fn match_card(&self, deck: &[Option<Card>]) -> bool {
deck.iter().flatten().any(|card| card == self)
}

这假设PartialEqCard 实现类型,通常可以使用 #[derive(PartialEq)] 完成.

flatten()上面代码中的方法处理每个 Option<Card>作为嵌套迭代器。迭代 Option如果选项为 None,则不产生任何元素,或者包含在选项中的单个值。这意味着 deck.iter().flatten()是一个产生 &Card 的迭代器对于所有 Some(_)切片中的项目,而所有 None项目被简单地跳过。

关于rust - 如何将结构方法中的 &self 与另一个结构进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com