Option<JoinHandle> is un-joinable

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=81f31999f35d53be48f3fa7ce78c9cbd

This ought to be simple, but I can't get it to compile.

I have an Option, because I have a struct which may optionally own a spawned thread. I can create this easily enough, but when it comes time to join, that's not possible. Tried:

    let status = self.child_thread.unwrap().join();

    let status = self.child_thread.as_ref().unwrap().join();

    let status = &self.child_thread.as_ref().unwrap().join();

also, boxing the JoinHandle. No good.

The problem is that JoinHandle is neither copyable nor cloneable, or here, moveable. So I can't get it out of the Option, and while inside the Option, I can't apply .join() to it.

I'm probably missing something obvious here.

You want to use Option::take:

let status = self.child_thread.take().unwrap().join();

This will replace self.child_thread with None, returning an owned Option<JoinHandle<()>> that you can then unwrap and join

2 Likes

Alternatively, to not panic on None:

let status = self.child_thread.take().map(|x| x.join());

Thanks. Code working now. Did not know about take, and was fussing around with various ref approaches.