Функция wait
, как вы ее определяете,
pub fn wait(&mut self) {
self.jh.join().expect("oops");
}
принимает изменяемую ссылку на S2
. Но JoinHandle::join
потребляет дескриптор (он принимает не ссылку, а значение)
Ключ к пониманию того, как обойти ошибку, - это подумать о том, в каком состоянии будет находиться объект S2 после s2.wait()
.
Если вы хотите, чтобы объект оставался действительным, но содержащийся в нем дескриптор соединения больше не будет действительным, тогда тип дескриптора не может быть JoinHandle<()>
, но может быть Option<JoinHandle<()>>
.
Если объект больше не действует после вызова wait
, вы можете сделать wait
принять self
вместо &mut self
.
Вы можете увидеть примеры с обоими эти подходы здесь . Они действительно заслуживают лучшей обработки ошибок, особенно в случае S3, когда двойной вызов .wait()
должен обрабатываться лучше. (В моей версии вы не можете выполнить двойной вызов S2, поскольку первый вызов потребляет ваш экземпляр).