生锈 borrowing/ownership

Rust borrowing/ownership

我正在使用 tcod-rs。用于绘制 RootConsole 的每个方法都采用 可变引用 。中央循环是一个 while 循环,它等待 window 关闭,然后清屏、绘制,然后刷新。 "check for window close" 方法也采用可变引用。 clearflush 也是。我有一个自定义绘图函数,需要一个可变引用才能绘制:

fn draw(root: &mut RootConsole) { /* Do state-y stuff */ }
while !root.window_closed() /* Mutable borrow 1 */ {
    root.clear(); // Mutable borrow 2
    draw(root); // Mutable borrow 3
    root.flush(); // Mutable borrow 4
}

编译器精神崩溃,尖叫着说外星人偷了 RootConsoles。通过仅进行它建议的更改,我已经设法将其减少到一个错误。我无法更改 tcod-rs 库,或者至少,我宁愿不更改,我更愿意继续使用它。例如,用 root.put_char(...) 替换 draw(root) 函数是可行的。

这是我尝试 cargo run 时遇到的错误。 tcod::console::Root 类型有文档 here

    error[E0596]: cannot borrow immutable argument `root` as mutable
  --> src/draw/mod.rs:27:33
   |
9  | pub fn draw_map(root: &mut RootConsole, world: WorldState) {
   |                 ---- consider changing this to `mut root`
...
27 |                 .draw_char(&mut root,
   |                                 ^^^^ cannot borrow mutably

我的实际 draw_map 代码非常简单:

pub trait DrawChar {
    fn draw_char(self, root: &mut RootConsole, pos: (i32, i32));
}

pub fn draw_map(root: &mut RootConsole, world: WorldState) {
    let screen_start_y = world.screen.1;
    let screen_end_y = screen_start_y + root.height();

    let screen_start_x = world.screen.0;
    let screen_end_x = screen_start_x + root.width();

    let x = screen_start_x;
    let y = screen_start_y;
    for scan_line in &world.map[screen_start_y as usize..
                                screen_end_y as usize]
    {
        y += 1;
        for unit in &scan_line[screen_start_x as usize..
                               screen_end_x as usize]
        {
            x += 1;
            unit.tiles[world.level as usize]
                .draw_char(&mut root,
                           (x as i32 - screen_start_x,
                            y as i32 - screen_start_y));
        }
    }
}

每个 tile 实现 DrawChar,因为它使用来自 tcod-rs on 根的函数,所以需要可变引用。我的主循环与上面的 while 循环没有太大区别,只是它使用一些本机函数处理键命令。

问题出在 draw_map 中的 draw_char 调用。 root 已经是对 RootConsole 的可变引用;您正在尝试将 draw_char 一个 可变引用 传递给 root,这实际上变成了对 可变引用 [=22= 的可变引用] 到 RootConsole。只需将 root 作为参数传递即可。