2016-05-23 3 views
0

In Rust möchte ich einen Rückruf (z. B. eine Schließung) angeben, der von einem Worker-Thread aufgerufen wird, wenn etwas Interessantes passiert. Was wäre die korrekte Signatur für den Rückruf?"Kann unveränderlichen Inhalt nicht als änderbar ausleihen" beim Verschieben einer Schließung in einen Thread

Dies ist ein Beispiel dafür, was ich zu tun versucht:

use std::thread; 

fn spawner(f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()> { 
    thread::spawn(move || { 
     f(); 
    }) 
} 


fn main() { 
    let cb = || { 
     println!("callback"); 
    }; 
    spawner(Box::new(cb)).join().unwrap(); 
} 
src/main.rs:5:9: 5:10 error: cannot borrow immutable `Box` content 
`*f` as mutable 

src/main.rs:5   f(); 

Antwort

2

Veränderlichkeit in Rust wird vererbt: da die Variable f hält die Box unveränderlich ist, wird der Inhalt der Box sind auch unveränderlich. Ein unveränderlicher FnMut Abschluss kann nicht aufgerufen werden (FnMut erfordert die Fähigkeit, seine Umgebung zu ändern).

Lösung: machen die Variable f wandelbar:

fn spawner(mut f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()>

1

Der Rust-Compiler ist nicht so dass Sie das unveränderliche Argument f in den Verschluss zu bewegen. Wenn Sie ihn in mutable ändern (indem Sie mut vor der Variable hinzufügen), hört der Compiler auf sich zu beschweren und Sie erhalten das gewünschte Verhalten.

use std::thread; 

fn spawner(mut f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()> { 
    thread::spawn(move || { 
     f(); 
    }) 
} 


fn main() { 
    let cb = || { 
     println!("callback"); 
    }; 
    spawner(Box::new(cb)).join().unwrap(); 
} 
Verwandte Themen