生锈 borrowing/ownership
Rust borrowing/ownership
我正在使用 tcod-rs。用于绘制 RootConsole
的每个方法都采用 可变引用 。中央循环是一个 while
循环,它等待 window 关闭,然后清屏、绘制,然后刷新。 "check for window close" 方法也采用可变引用。 clear
和 flush
也是。我有一个自定义绘图函数,需要一个可变引用才能绘制:
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
s。通过仅进行它建议的更改,我已经设法将其减少到一个错误。我无法更改 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
作为参数传递即可。
我正在使用 tcod-rs。用于绘制 RootConsole
的每个方法都采用 可变引用 。中央循环是一个 while
循环,它等待 window 关闭,然后清屏、绘制,然后刷新。 "check for window close" 方法也采用可变引用。 clear
和 flush
也是。我有一个自定义绘图函数,需要一个可变引用才能绘制:
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
s。通过仅进行它建议的更改,我已经设法将其减少到一个错误。我无法更改 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
作为参数传递即可。