你如何在Rust中迭代和更改可变数组的值?

3
这是我目前的进展:
#[derive(Copy, Clone, Debug)]
enum Suits {
    Hearts,
    Spades,
    Clubs,
    Diamonds,
}

#[derive(Copy, Clone, Debug)]
struct Card {
    card_num: u8,
    card_suit: Suits,
}

fn generate_deck() {
    let deck: [Option<Card>; 52] = [None; 52];

    for mut i in deck.iter() {
        i = &Some(Card {
            card_num: 1,
            card_suit: Suits::Hearts,
        });
    }

    for i in deck.iter() {
        println!("{:?}", i);
    }
}

fn main() {
    generate_deck();
}

它仅仅打印出None。我的借用有问题吗?我做错了什么?


1
你犯错的线索之一在输出中:“警告:i赋值从未被读取”,针对这行代码:i = &Some(Card {。它没有被任何地方读取,因此变异没有任何效果。你正在为一个变量编写一个新引用,并且没有给现有引用一个新值。 - Peter Hall
1个回答

8

首先,您的牌堆是不可变的。请记住,在 Rust 中,默认情况下绑定是不可变的:

let mut deck: [Option<Card>; 52] = [None; 52];

接下来,要获取一个可修改的迭代器,您可以使用iter_mut()

for i in deck.iter_mut() {

最后: 在你的循环中,i 是指向 deck 中元素的可变引用。若要给引用赋值,则需要对其解除引用:

*i = Some(Card {
    card_num: 1,
    card_suit: Suits::Hearts,
});

Playground链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接