首页 > 解决方案 > 如何将结构方法中的 &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

标签: rust

解决方案


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


推荐阅读