Rust 如何在不引入新范围的情况下结束借用对象?

Rust 如何在不引入新范围的情况下结束借用对象?,rust,move-semantics,borrow-checker,Rust,Move Semantics,Borrow Checker,我希望在对象被传递给另一个改变其状态的对象后,以只读方式访问该对象。我知道,当一个对象仍处于借用控制之下时,访问该对象会出现问题 extern crate renderay_rs; use renderay_rs::*; fn draw_canvas(canvas: &Canvas) { let max_height = canvas.height; let max_width = canvas.width; for iterator_y in 0..max

我希望在对象被传递给另一个改变其状态的对象后,以只读方式访问该对象。我知道,当一个对象仍处于借用控制之下时,访问该对象会出现问题

extern crate renderay_rs;

use renderay_rs::*;

fn draw_canvas(canvas: &Canvas) {
    let max_height = canvas.height;
    let max_width = canvas.width;

    for iterator_y in 0..max_height {
        for iterator_x in 0..max_width {
            print!("{}", canvas.array[iterator_y * iterator_x]);
        }
        print!("\n");
    }
}


fn main() {
    let point = Point { x: 5, y: 5 };
    let mut canvas = Canvas {
        width: 10,
        height: 10,
        array: vec!['o'; 10*10],
    };

    let mut renderer = CanvasRenderer::new(&mut canvas);
    renderer.render_point('A', point);

    draw_canvas(canvas);
}
我觉得应该在
renderer.render_point(…,…)
方法之后结束借用。有没有办法做到这一点?对象的状态更改后,它或
CanvasRenderer
无需借用对象


我以前使用过块范围,但我对这种方法不满意。我希望你能给我一个更好的选择提示

您可以引入一个块来缩小
渲染器的范围

fn main() {
    let point = Point { x: 5, y: 5 };
    let mut canvas = Canvas {
        width: 10,
        height: 10,
        array: vec!['o'; 10*10],
    };

    {
        let mut renderer = CanvasRenderer::new(&mut canvas);
        renderer.render_point('A', point);
    }

    draw_canvas(canvas);
}
如果您不喜欢块,另一种方法是使用函数。Rust将能够从生命周期中找出借入结束的位置(此处函数不返回任何内容,因此借入在函数调用后结束):


您可以引入一个块来缩小
渲染器的范围

fn main() {
    let point = Point { x: 5, y: 5 };
    let mut canvas = Canvas {
        width: 10,
        height: 10,
        array: vec!['o'; 10*10],
    };

    {
        let mut renderer = CanvasRenderer::new(&mut canvas);
        renderer.render_point('A', point);
    }

    draw_canvas(canvas);
}
如果您不喜欢块,另一种方法是使用函数。Rust将能够从生命周期中找出借入结束的位置(此处函数不返回任何内容,因此借入在函数调用后结束):


谢谢,但正如我之前所说,我使用过块作用域,但对这种方法不满意-真的没有其他方法可以做到这一点吗?我添加了一种使用函数的方法。你不喜欢块有什么?我认为答案很好:块毕竟是在模仿代码的运行时。虽然迂腐地说,使用函数只是引入新范围/块的另一种方式。是的,但由于他没有说他不喜欢块的内容,我试图隐藏它们:-谢谢你,但正如我之前所说,我使用了块范围,但对这种方法不满意-真的没有其他方法可以做到吗?我添加了一种函数方法。你不喜欢块有什么?我认为答案很好:块毕竟是在模仿代码的运行时。虽然迂腐地说,使用函数只是引入新范围/块^ ^的另一种方式。是的,但由于他没有说他不喜欢块的内容,我试图隐藏它们:-°