不能借用“win”作为不可变的,因为它也被借用为可变的

cannot borrow `win` as immutable because it is also borrowed as mutable

提问人:Nibodh Daware 提问时间:7/30/2022 更新时间:7/30/2022 访问量:68

问:

我得到一个不能借用为不可变的,因为它也被借为可变的 作为注释行win

let (mut win, thread) = raylib::init().size(800, 600).title("Demo").build();
// error at borrowing win
draw.draw_rectangle(
            // here
            win.get_screen_width() / 2,
            0,
            5,
            // and here
            win.get_screen_height(),
            Color::WHITE,
);
参考 不变性 可变 借用检查器

评论

0赞 nikoss 7/30/2022
您能否也分享错误消息
0赞 Cerberus 7/30/2022
该示例不完整。你用的是什么,你用的是什么版本?drawraylib
0赞 Peter Hall 7/30/2022
您需要提供更多信息。一个最小的可重复的例子会让人们有机会帮助你。
0赞 Peter Hall 7/30/2022
但是,在对代码的其余部分进行大量猜测时,您可以通过引入新变量和方法调用之前来解决这个问题,而不是全部内联完成。widthheight
0赞 Finomnis 7/30/2022
您显示的代码不包含实际问题。win.get_screen_width() 是不可变的借用,win.get_screen_height() 也是如此。这应该可以编译。实际错误来自您未在此处显示的代码。我同意@PeterHall,请提供一个最小的可重复示例。

答:

0赞 Azelytof 7/30/2022 #1

我认为有两种可能性(您没有提供足够的资源来在我的工作区中测试它,所以这只是假设):

在调用之前保存长度:

let (mut win, thread) = raylib::init().size(800, 600).title("Demo").build();
let width = win.get_screen_width() / 2;
let height = win.get_screen_height();
draw.draw_rectangle(width, 0, 5, height, Color::WHITE);

或者你可以克隆你的实例:

let (mut win, thread) = raylib::init().size(800, 600).title("Demo").build();
draw.draw_rectangle(win.clone().get_screen_width() / 2, 0, 5, win.clone().get_screen_height(), Color::WHITE);

希望这能有所帮助(并且^^工作)

评论

0赞 Peter Hall 7/30/2022
OP 确实需要添加更多信息才能回答这个问题。此解决方案不太可能起作用,因为错误表明 takes 和 that 必须包含可变引用。在这种情况下,您必须在分配之前引入宽度和高度变量。draw_rectangle&mut selfdrawwindraw
0赞 Nibodh Daware 7/31/2022
这在解构我的代码以将宽度和高度转换为变量后起作用rust let (mut win, thread) = raylib::init().size(800, 600).title("Demo").build(); let win_width = win.get_screen_width(); let win_height = win.get_screen_height(); // then while calling draw draw.draw_rectangle(win_width / 2, 0, 5, win_height, Color::WHITE);