断言结构向量长度

问题描述 投票:0回答:1

我在 Rust 中的第一个项目是一个类似扑克牌的小型纸牌游戏,有五列,玩家可以在其中放入五张牌。

Card
是一个从外部 API 获取其值和套件的结构。另一方面,
Board
存储我之前谈到的列。现在,我想通过运行测试来测试
Board
列是否获得超过五张卡片。

卡:

pub struct Card {
    value: String,
    suit: String,
}

impl Card {
    pub fn new(value: String, suit: String) -> Card {
        Card { value, suit }
    }
}

董事会:

use crate::card::Card;

struct Board {
    columns: [Vec<Card>;5]
}

impl Board {
    fn add_card(self){# adds a card}

测试:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn no_card_full_column() {
        let card_one = Card::new(String::from("4"), String::from("Spades"));
        let card_two = Card::new(String::from("3"), String::from("Spades"));
        let card_three = Card::new(String::from("2"), String::from("Spades"));
        let card_four = Card::new(String::from("5"), String::from("Spades"));
        let card_five = Card::new(String::from("6"), String::from("Spades"));
        let mut board = Board {
            columns: [vec![], vec![], vec![], vec![], vec![]],
        };
        board.columns[0].push(card_one);
        board.columns[0].push(card_two);
        board.columns[0].push(card_three);
        board.columns[0].push(card_four);
        board.columns[0].push(card_five);

        board.add_card();
        assert_eq!(&board.columns[0].len(), 5);
    }
}

rust-analyzer
抱怨
can't compare &usize with integer
(顺便说一句,我知道 usize 借用),所以我有几个问题:

  1. 结构向量是否以不同的方式分配内存,即使用
    usize
    而不是
    integer
  2. 我研究了文档,但没有得到任何可以使用的东西,所以我尝试将
    usize
    转换为整数,我知道这并不优雅,但我想通过测试并稍后改进它(绿色,红色,重构)。我不认为投射长度是答案。我还应该继续绑吗?
unit-testing rust vector struct assert
1个回答
0
投票

编译器抱怨您正在将引用与值进行比较,因为您正在将

&_
_
进行比较,就像在做
&420 == 69 (&i32 to i32)
一样。

所以只需删除

&

assert_eq!(board.columns[0].len(), 5);

我怀疑您首先添加

&
的原因是因为此错误消息。

error[E0382]: borrow of moved value: `board`
  --> ***\src/main.rs:36:16
   |
26 |     let mut board = Board {
   |         --------- move occurs because `board` has type `Board`, which does not implement the `Copy` trait
...
35 |     board.add_card();
   |           ---------- `board` moved due to this method call
36 |     assert_eq!(board.columns[0].len(), 5);
   |                ^^^^^^^^^^^^^^^^ value borrowed here after move

但那是因为之前的

board.add_card()
行, 该函数取得所有权。

您可以通过注释掉上一行来确认这一点,错误就会消失,

解决方案

1 更改参考

将功能更改为仅供参考,如果需要,请

&mut

impl Board {
    fn add_card(&mut self){todo!()}
}

2回归自我

更改函数以获取所有权并返回

Self

impl Board {
    fn add_card(self)->Self{todo!()}
}

用法

let board = board.add_card();

/// you can chain method like this
let board = board
        .add_card()
        .add_card()
        .add_card()
        .add_card()
        .add_card()
        .add_card();
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.