2016-08-22 57 views
0

我想在一個對象被傳遞給改變其狀態的另一個對象後以只讀方式訪問對象。我知道訪問一個對象的時候仍然存在一個問題,那就是當它仍然受到借用的控制時。如何在不引入新範圍的情況下結束對象的借用?

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

我以前使用過塊範圍,但我對這種方法並不滿意。我希望你能給我一個更好的選擇的提示!

回答

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

謝謝你,但正如我所說我使用塊範圍之前,但對這種方法並不滿意 - 是否真的沒有其他方法可以做到這一點? – xetra11

+0

我已經添加了一種功能的方式。你不喜歡什麼東西? – mcarton

+0

我認爲答案很好:畢竟,塊模仿代碼的運行時間。儘管迂迴,使用函數只是另一種引入新範圍/塊的方法^ _ ^。 – Shepmaster

相關問題