Estou tentando escrever uma função para encontrar o valor de uma mão de cartas. Como parte disso, preciso verificar se a mão é flush. Meu código para fazer isso é:
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
}
No entanto, se você tentar executar este código, encontrará um erro mostrando que player_hand.cards
foi parcialmente movido devido à chamada do método para map
. Considerando que o mapa é solicitado a um empréstimo imutável de, player_hands
não entendo como isso é possível, pois parece estar em contradição direta com as regras de empréstimo da ferrugem.
Alguém poderia explicar o que está acontecendo aqui e como/por que isso é possível? Obrigado,
Para contexto:
#[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,
}
Isso simplesmente não é verdade. O
find_hand_value
possui oplayer_hand
e amap
função nos arrays assume a propriedade do array:Há duas coisas que podem ser confusas aqui.
Você não está pedindo emprestado
Primeiro, você pode estar pensando nesta linha:
pega um empréstimo
player_hands.cards
emap
o cobra. Mas não é assim que isso é analisado, na verdade é:então apenas um empréstimo (inútil) do
bool
valor retornado. Você pode escrever explicitamente:e então você receberá um erro diferente, informando que
map
não pode ser solicitado um empréstimo:Errado
map
A outra coisa é que existe o
map
com o qual a maioria das pessoas está familiarizada que pode ser chamado em umIterator
, que pode ser obtido de uma fatia emprestada comiter
. A solução aqui é... mover as chamadas e começar comiter
:Isso ainda não compila, porque
Suit
não é copiado, então o mapa tenta movê-lo, mas este é bastante simples, apenasderive(Clone, Copy)
emSuit
.