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

时间:2016-08-22 10:40:19

标签: 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_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

之前我曾使用过块范围,但我对此方法并不满意。我希望你能给我一个更好的替代品的暗示!

1 个答案:

答案 0 :(得分:5)

您可以引入一个块来缩小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将能够确定借用从生命周期结束的位置(此处函数不返回任何内容,因此借用在函数调用之后结束):

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);
}