【问题标题】:How to end the borrowing of an object without introducing a new scope?如何在不引入新范围的情况下结束对象的借用?
【发布时间】:2016-08-22 10:40:18
【问题描述】:

我想在一个对象被传递给另一个改变其状态的对象后以只读方式访问它。我知道在对象仍受借用控制时访问对象存在问题。

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

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

【问题讨论】:

    标签: rust move-semantics borrow-checker


    【解决方案1】:

    可以引入块来缩小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);
    }
    

    【讨论】:

    • 谢谢你,但正如我所说,我以前使用过块作用域,但对这种方法不满意 - 真的没有其他方法吗?
    • 我添加了一种函数方式。你不喜欢积木的什么地方?
    • 我认为答案很好:毕竟,块在模仿代码的运行时间。虽然迂腐,但使用函数只是引入新范围/块的另一种方式^_^。
    • 是的,但由于他没有说他不喜欢积木,我试图隐藏它们:-°
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2015-12-04
    • 2021-04-28
    • 2012-04-14
    • 2018-08-23
    相关资源
    最近更新 更多