rust - 在 Rust 中结束可变借用的选项有哪些?

标签 rust borrow-checker

我正在与借用检查器打交道 - 奇迹啊奇迹。

虽然我通过添加 block 找到了解决方案,但我很好奇是否还有其他方法可以结束可变借用,以便下一条语句之后可以访问绑定(bind)。

这是我到目前为止所做的:

let mut canvas: Canvas = Canvas {
    width: 5,
    height: 5,
    array: vec!['x'; 5*5],
};

{
    let mut renderer: CanvasRenderer = CanvasRenderer::new(&mut canvas);

    renderer.render_point('x', 3, 3);
}

println!("The Value in the array is: {}", canvas.array[9]);

我在 CanvasRenderer 对象的绑定(bind)周围包装了一个 block ,在改变 Canvas 和范围结束后,CanvasRenderer 死了,我的可变借用了 canvas 可供阅读或其他任何内容。

这行得通 - 但现在我想看看其他解决方案!

我听说过 drop(stuff) 但它并没有像我想象的那样工作。

最佳答案

没有别的办法;使用 block 是 的方法。在 Rust 2018 之前(在 Rust 1.31 中可用)所有借用都是词法的,也就是说,它们总是对应于某个词法范围。唯一大于单个语句的范围是 block 的范围,因此 block 是限制借用范围的唯一工具。

drop() 不会工作有两个原因:首先,因为它需要非词法作用域,这在 Rust 2018 之前不受支持,其次,它不能成为一个通用工具管理借用:例如,它无法结束一个不可变借用,仅仅因为不可变引用是Copy并且不能被“删除”。

另见:

关于rust - 在 Rust 中结束可变借用的选项有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35765440/

相关文章:

rust - 如何将数据从 csv::StringRecord 推送到结构中的每个列向量?

rust - 是否可以从Self中获取非借入类型?

rust - 如何将 rustc 标志传递给 cargo ?

rust - 将 Struct <'a>::method as a ` 传递给 <'a> Fn(&Foo<' a>)` 以在闭包中使用

generics - 当泛型类型受到泛型生存期的限制时,这意味着什么?

rust - 即使 NLL 打开,循环中的双可变借用错误也会发生

rust - 我什么时候可以省略星号运算符的取消引用?

rust - 将 Ref::map 与特征对象一起使用时无法推断生命周期

for-loop - 如何在 for 循环中进行可变借用?

rust - 如果我想将单个可变对象传递给函数的多个参数,我该怎么办?