E 'abbastanza facile scrivere una versione simile da soli, utilizzando solo strumenti dalla libreria standard:
use std::thread;
use std::time::Duration;
struct Timer<F> {
delay: Duration,
action: F,
}
impl<F> Timer<F>
where
F: FnOnce() + Send + Sync + 'static,
{
fn new(delay: Duration, action: F) -> Self {
Timer { delay, action }
}
fn start(self) {
thread::spawn(move || {
thread::sleep(self.delay);
(self.action)();
});
}
}
fn main() {
fn x() {
println!("hello");
let t = Timer::new(Duration::from_secs(2), x);
t.start();
}
let t = Timer::new(Duration::from_secs(2), x);
t.start();
// Wait for output
thread::sleep(Duration::from_secs(10));
}
Come pointed out by malbarbo, questo vuol creare una nuova thre annuncio per ogni timer. Questo può essere più costoso di una soluzione che riutilizza i thread ma è un esempio molto semplice.
Si può usare questo per aggiornare un campo in una struttura mutevole? – lsund
@lsund Se intendi se sia possibile o meno lasciare un riferimento mutabile nella chiusura accessibile da altrove, dalla sorgente della cassa sembra che la risposta sia "no" tranne un "Mutex" o "Arco" ecc. Rif. a un globale 'Cella-e-amici (o codice 'non sicuro'). – user
(e poi ci sono [canali] (https://doc.rust-lang.org/std/sync/mpsc/fn.channel.html) e [scoped_tls] (https://github.com/alexcrichton/scoped -tls/blob/master/src/lib.rs) e roba, ma alla fine è ancora necessario chiudere l'oggetto in un modo 'Send-ly ') – user