gpt4 book ai didi

Rust 借用/所有权

转载 作者:行者123 更新时间:2023-11-29 08:34:38 30 4
gpt4 key购买 nike

我正在使用 tcod-rs。用于绘制到 RootConsole 的每个方法都采用一个可变引用。中央循环是一个 while 循环,它等待窗口关闭、清除屏幕、绘制,然后刷新。 “检查窗口关闭”方法也采用可变引用。 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
}

编译器精神崩溃,尖叫着说外星人窃取了 RootConsole。通过仅进行它建议的更改,我已经设法将其减少到一个错误。我无法更改 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));
}
}
}

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

最佳答案

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

关于Rust 借用/所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866571/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com