我想移动MutexGuard
。从函数返回MutexGuard
可以正常工作,而无需提供生命周期参数。但是,当将防护程序打包到结构中时,编译器需要为防护程序提供一个生存期参数。
下面的代码编译没有错误:
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
据我了解,生命周期参数的要求对于函数返回类型和结构应相同。我在这里想念什么?
答案 0 :(得分:0)
这在Rust中或多或少是任意设计的决定。
函数中存在 lifetime Elision ,编译器根据函数参数中引用的生存期来猜测结构可能具有的生存期。
拥有foo(&'a self) -> Struct<'a>
时,只有一个生存期('static
除外)。这是一种常见情况,Rust出于方便起见暗示了这一点:foo(&self) -> Struct
。
在结构中引用的定义被认为是不够普遍和明确的,以至于也没有生命周期,而拥有明确的生命周期定义的愿望就赢了。