为什么MutexGuard需要在结构中使用生命周期参数,而在函数返回类型中不需要?

时间:2018-06-20 19:05:52

标签: rust lifetime

我想移动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

据我了解,生命周期参数的要求对于函数返回类型和结构应相同。我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

这在Rust中或多或少是任意设计的决定。

函数中存在 lifetime Elision ,编译器根据函数参数中引用的生存期来猜测结构可能具有的生存期。

拥有foo(&'a self) -> Struct<'a>时,只有一个生存期('static除外)。这是一种常见情况,Rust出于方便起见暗示了这一点:foo(&self) -> Struct

在结构中引用的定义被认为是不够普遍和明确的,以至于也没有生命周期,而拥有明确的生命周期定义的愿望就赢了。