rust - 如何将结构方法中的 &self 与另一个结构进行比较
问题描述
我不确定为什么,但我的方法不起作用,有没有办法将 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
语句。您可以阅读本书中关于模式语法的小节中的模式。
仅由标识符组成的模式,例如x
,匹配所提供的任何值,并将该值分配给x
。这意味着该模式self
不会将该值与 的值进行比较self
,而是尝试将匹配表达式的值分配给self
,这是不允许的,如错误消息所述。
你的函数应该这样写:
fn match_card(&self, deck: &[Option<Card>]) -> bool {
deck.iter().flatten().any(|card| card == self)
}
这假设PartialEq
是为Card
类型实现的,通常可以使用#[derive(PartialEq)]
.
上面代码中的flatten()
方法将每个都Option<Card>
视为嵌套迭代器。如果选项是 ,则迭代 aOption
不会产生任何元素None
,否则选项中包含的单个值。这意味着这deck.iter().flatten()
是一个迭代器,它为切片中的&Card
所有项目产生一个,而所有项目都被简单地跳过。Some(_)
None
推荐阅读
- c++ - QAbstractProxyModel:如何实现方法?
- jquery - TinyMCE - 更改默认背景颜色
- android - 对不同的 gradle 任务有不同的 Android lintOptions
- javascript - 尝试在 Vue.js 中显示 highcharts 图表时,如何修复错误 #17“请求的系列类型不存在”错误?
- spring - 如何在spring boot中调用服务
- java - 声纳扫描仪在本地运行但不适用于詹金斯管道
- angular - HttpInterceptor 不拦截 Angular 10 中的请求
- cloud - 谷歌云过滤443端口上的应用程序(防火墙优先级问题)
- python-3.x - 如何创建新数据库或连接到现有数据库
- python - 在 numpy 数组中跟踪标志