2016-08-22 2 views
0

Ich möchte auf ein Objekt als schreibgeschützt zugreifen, nachdem es an ein anderes Objekt übergeben wurde, das seinen Status ändert. Ich weiß, dass es ein Problem beim Zugriff auf ein Objekt gibt, wenn es noch unter Kontrolle ist, indem es ausgeliehen wird.Wie kann man das Ausleihen eines Objekts beenden, ohne einen neuen Bereich einzuführen?

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

Ich glaube, ich sollte die Kreditaufnahme nach dem renderer.render_point(..., ...) Verfahren beenden. Gibt es einen Weg dazu? Das Objekt muss nicht von ihm oder dem CanvasRenderer ausgeliehen werden, nachdem sein Zustand geändert wurde.

Ich habe Block Scope vorher verwendet, aber ich bin nicht glücklich mit diesem Ansatz. Ich hoffe du kannst mir einen Tipp für eine bessere Alternative geben!

Antwort

5

Sie können einen Block einführen, um den Umfang der renderer zu reduzieren:

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

Ein anderer Weg, wenn Sie nicht über Blöcke wie ist es, Funktionen zu verwenden. Rust wird in der Lage sein, um herauszufinden, wo die borrow von dem Lebensdauern endet (hier die Funktion etwas nicht zurückkehrt, so dass der borrow nach dem Funktionsaufruf endet):

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

Dank dafür aber wie gesagt, ich verwenden Block Umfang vor, aber bin nicht glücklich mit diesem Ansatz - gibt es wirklich keinen anderen Weg, es zu tun? – xetra11

+0

Ich habe einen Weg mit Funktionen hinzugefügt. Was magst du nicht mit Blöcken? – mcarton

+0

Ich denke, die Antwort ist in Ordnung: Blöcke imitieren schließlich die Laufzeit des Codes. Obwohl es pedantisch ist, ist die Verwendung von Funktionen nur ein weiterer Weg, um einen neuen Bereich/Block einzuführen^_ ^. – Shepmaster

Verwandte Themen