我想移动一台MutexGuard。从函数返回一个生命周期可以很好地工作,而不需要提供MutexGuard参数。但是,当将guard打包到结构中时,编译器需要guard的生命周期参数。
下面的代码编译时没有错误:
struct Queue {
queue: Mutex<Vec<i32>>,
}
impl Queue {
pub fn get_mutex_guard(&self) -> MutexGuard<Vec<i32>> {
self.queue.lock().unwrap()
}
}当我尝试将MutexGuard打包到结构中时:
struct QueueHandle {
handle: MutexGuard<Vec<i32>>,
}编译器会报告缺少生命周期参数:
error[E0106]: missing lifetime specifier
--> mutex-guard.rs:8:13
|
8 | handle: MutexGuard<Vec<i32>>
| ^^^^^^^^^^^^^^^^^^^^ expected lifetime parameter据我所知,对于函数返回类型和结构,生存期参数的要求应该是相同的。这里我漏掉了什么?
发布于 2018-07-09 00:25:51
在Rust中,这或多或少是武断的设计决策。
在函数中存在生命周期省略,编译器根据函数参数中引用的生命周期来猜测结构的生命周期。
当你使用foo(&'a self) -> Struct<'a>时,生命周期只有一次(除了'static)。这是一种常见的情况,为了方便起见,Rust允许隐含这一点:foo(&self) -> Struct。
结构中的引用定义没有被认为是通用的和明确的,也不足以避免生命周期,而拥有显式生命周期定义的愿望赢得了胜利。
https://stackoverflow.com/questions/50955374
复制相似问题