Оператор 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>
как вложенный итератор. Итерация Option
не дает никаких элементов, если опция None
, или иное значение, заключенное в опцию. Это означает, что deck.iter().flatten()
является итератором, выдающим &Card
для всех Some(_)
элементов в срезе, тогда как все None
элементов просто пропускаются.