Я порождаю поток, который делает некоторую работу.Иногда я хочу, чтобы эта нить умерла после завершения работы, иногда я хочу, чтобы она ждала, когда будет выполнено больше работы.Для этого я передаю Option<Receiver<T>>
.Если Option<Receiver<T>>
равно None
поток должен умереть, иначе он должен ждать, чтобы получить больше работы.
fn foo(rx: Option<Receiver<usize>>) {
thread::spawn(move || {
loop {
do_some_work();
if let Some(r) = rx {
match r.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
} else {
break; //Die
}
}
});
}
( ссылка на площадку )
Компиляторговорит:
error[E0382]: use of moved value
--> src/lib.rs:10:25
|
10 | if let Some(r) = rx {
| ^ value moved here, in previous iteration of loop
|
= note: move occurs because value has type `std::sync::mpsc::Receiver<usize>`, which does not implement the `Copy` trait
Однако, если Receiver
не заключен в Option
, все в порядке.
fn foo(rx: Receiver<usize>) {
thread::spawn(move || {
loop {
do_some_work();
match rx.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
}
});
}