在很少的情况下,我们必须调用一些数据成员的方法,这些方法拥有它们的所有权,但我们只有像&mut self
后面的引用访问权.处理这个问题的一种模式是将它们包装在Option
类型中,然后将它们包装在take()
类型中以继续进行.
以下是该书中的一个例子:
struct Worker {
id: usize,
thread: Option<thread::JoinHandle<()>>,
}
pub struct ThreadPool {
workers: Vec<Worker>,
sender: Option<mpsc::Sender<Job>>,
}
impl Drop for ThreadPool {
fn drop(&mut self) {
drop(self.sender.take());
for worker in &mut self.workers {
if let Some(thread) = worker.thread.take() {
thread.join().unwrap();
}
}
}
}
通知thread
和sender
被包装在Option
中,只是为了在程序退出之前调用析构函数中的join
和drop
.然而,几乎他们的一生(除了在停止之前),他们将不会是None
岁.这里使用的Option
型是标准的feels more like a work around rather than utilizing its semantic that there could be a value there or not型.
这种模式在铁 rust 项目中普遍存在吗?或者有其他 Select 吗?我担心的是,在代码库中,我可能无法从这种看似专用的用法中快速分辨出"真正的可选用例",而且可能会强制执行大量的as_ref()
或unwrap()
个调用.