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

How to end the borrowing of an object without introducing a new scope?

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

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借用

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

你可以引入一个块来缩小renderer的范围:

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 将能够从生命周期中找出借用在何处结束(这里函数没有 return 任何东西,因此借用在函数调用后结束):

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

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

    render_things(&mut canvas);
    draw_canvas(canvas);
}