选项<接收器>在上一个循环迭代中移动

时间:2019-03-04 23:46:19

标签: rust spawn borrow-checker receiver

我正在生成一个可以完成某些工作的线程。有时,我希望该线程在工作完成后消失,而其他时候,我希望它等待更多工作。为此,我传入了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
            }
        }
    });
}

link to playground

编译器说:

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!"),
            }
        }
    });
}

1 个答案:

答案 0 :(得分:3)

if let Some(r) = rx时会消耗rx,因此以后无法使用。

您可以使用as_ref()来获取对内部对象的引用,而使rx可用:

fn foo(rx: Option<Receiver<usize>>) {
    thread::spawn(move || {
        loop {
            do_some_work();
            if let Some(r) = rx.as_ref() {
                match r.recv() {
                    Ok(x) => {}
                    Err(_) => panic!("Oh no!"),
                }
            } else {
                break; //Die
            }
        }
    });
}

link to playground