代码之家  ›  专栏  ›  技术社区  ›  wavesinaroom

断言结构向量长度

  •  0
  • wavesinaroom  · 技术社区  · 5 月前

    我在rust的第一个项目是一个类似扑克的小型纸牌游戏,有五列玩家放入五张牌。 Card 是一个从外部获取其值和套件的结构体 API . 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. 我研究了医生,但没有得到任何有用的东西,所以我试着选演员 使用 对于整数,我知道这并不优雅,但我想通过测试并在以后进行改进(绿色、红色、重构)。我不认为长度是答案。我还应该继续打领带吗?
    1 回复  |  直到 5 月前
        1
  •  1
  •   啊鹿Dizzyi    5 月前

    编译器抱怨你正在将引用与值进行比较,因为你正在进行比较 &_ _ ,就像做 &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();