我在 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 借用),所以我有几个问题:
usize
而不是 integer
?usize
转换为整数,我知道这并不优雅,但我想通过测试并稍后改进它(绿色,红色,重构)。我不认为投射长度是答案。我还应该继续绑吗?编译器抱怨您正在将引用与值进行比较,因为您正在将
&_
与 _
进行比较,就像在做 &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()
行,
该函数取得所有权。
您可以通过注释掉上一行来确认这一点,错误就会消失,
将功能更改为仅供参考,如果需要,请
&mut
。
impl Board {
fn add_card(&mut self){todo!()}
}
更改函数以获取所有权并返回
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();