我正在尝试编写一个函数来查找一手牌的价值。作为其中的一部分,我需要检查这手牌是否是同花。我这样做的代码是:
use itertools::Itertools; // allows use of .all_equal()
fn find_hand_value(player_hand: Hand) {
let is_flush: &bool = &player_hand.cards.map(|card| card.suit).iter().all_equal();
// ... further checks
println!("{:?}", player_hand) // print takes ownership to represent further use of the hand
// return hand value
}
但是,如果您尝试运行此代码,您将遇到一个错误,显示player_hand.cards
由于方法调用而已部分移动map
。考虑到地图是在不可变的借用上调用的,player_hands
我不明白这是怎么可能的,因为它似乎与 Rust 的借用规则直接矛盾。
有人可以解释一下这里发生了什么以及如何/为什么可能吗?谢谢,
对于上下文:
#[derive(Debug)]
struct Hand {
cards: [Card; 5],
}
#[derive(Debug)]
struct Card {
suit: Suit,
value: Value,
}
#[derive(Debug, PartialEq, Eq)]
enum Suit {
Hearts,
Diamonds,
Spades,
Clubs,
}
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq)]
enum Value {
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
Ace,
}
那不是真的。拥有
find_hand_value
,player_hand
并且数组上的map
函数拥有该数组的所有权:这里有两件事可能会令人困惑。
你不借
首先,您可能会想到这一行:
借入
player_hands.cards
并赎回map
。但这不是如何解析的,实际上是这样的:所以只是借用返回
bool
值(无用)。你可以明确地写:然后你会得到一个不同的错误,告诉你
map
不能在借用时调用:错误的
map
另一件事是,有一个
map
大多数人都熟悉的 可以在 an 上调用Iterator
,它可以从借用的切片中获得iter
。这里的解决方法是......移动调用并从以下位置开始iter
:这仍然无法编译,因为
Suit
不是复制,所以地图尝试移动它,但这一个相当简单,就derive(Clone, Copy)
在Suit
.