我正在尝试学习 Rust,正如你所想象的那样,借用检查器是我最大的对手。这是我的设置,它是一种用于游戏战舰的板条箱。游戏基于 Battlefield 结构体,该结构体由 Cell 组成。Cell 可以引用 Ship,而 Ship 具有所有引用它的 Cell 的向量,因此它是双向只读关系。
我知道这只是一个简短的摘录,但整个代码太长了,无法在此处发布。可以在这里找到该项目(使用'cargo build'进行标准构建)。
pub struct Battlefield<'a> {
cells: Vec<Vec<Cell<'a>>>,
}
#[derive(Debug, PartialEq)]
pub struct Cell<'a> {
ship: Option<&'a Ship<'a>>
}
#[derive(Debug, PartialEq)]
pub struct Ship<'a> {
length: usize,
cells: Vec<&'a Cell<'a>>,
}
我的问题是Battlefield
的place_ship
函数:
impl<'a> Battlefield<'a> {
pub fn place_ship(&mut self,
ship: &'a mut Ship,
x: usize,
y: usize,
orientation: Orientation)
-> PlaceResult {
// check ship placement in bounds
// check affected cells are free
// set cells' ship ref to ship
// add cell refs to ship's cells field
}
}
我觉得这很有道理,而且我认为这里没有所有权问题,但是似乎我错了:
#[cfg(test)]
mod tests {
use super::{Battlefield, X, Y};
use super::Orientation::*;
use super::super::ship::Ship;
#[test]
fn assert_ship_placement_only_in_bounds() {
let mut ship = Ship::new(3);
let mut bf = Battlefield::new();
assert_eq!(Ok(()), bf.place_ship(&mut ship, 0, 0, Horizontal));
assert_eq!(Ok(()), bf.place_ship(&mut ship, 5, 5, Vertical));
}
}
src/battlefield.rs:166:47: 166:51 error: cannot borrow `ship` as mutable more than once at a time [E0499]
src/battlefield.rs:166 assert_eq!(Ok(()), bf.place_ship(&mut ship, 5, 5, Vertical));
^~~~
src/battlefield.rs:165:47: 165:51 note: first mutable borrow occurs here
src/battlefield.rs:165 assert_eq!(Ok(()), bf.place_ship(&mut ship, 0, 0, Horizontal));
^~~~
我知道这只是一个简短的摘录,但整个代码太长了,无法在此处发布。可以在这里找到该项目(使用'cargo build'进行标准构建)。