首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MutexGuard在结构中需要生命周期参数,而在函数返回类型中不需要?

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

Stack Overflow用户
提问于 2018-06-21 03:05:52
回答 1查看 542关注 0票数 2

我想移动一台MutexGuard。从函数返回一个生命周期可以很好地工作,而不需要提供MutexGuard参数。但是,当将guard打包到结构中时,编译器需要guard的生命周期参数。

下面的代码编译时没有错误:

代码语言:javascript
复制
struct Queue {
    queue: Mutex<Vec<i32>>,
}

impl Queue {
    pub fn get_mutex_guard(&self) -> MutexGuard<Vec<i32>> {
        self.queue.lock().unwrap()
    }
}

当我尝试将MutexGuard打包到结构中时:

代码语言:javascript
复制
struct QueueHandle {
    handle: MutexGuard<Vec<i32>>,
}

编译器会报告缺少生命周期参数:

代码语言:javascript
复制
error[E0106]: missing lifetime specifier
 --> mutex-guard.rs:8:13
  |
8 |     handle: MutexGuard<Vec<i32>>
  |             ^^^^^^^^^^^^^^^^^^^^ expected lifetime parameter

据我所知,对于函数返回类型和结构,生存期参数的要求应该是相同的。这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-07-09 00:25:51

在Rust中,这或多或少是武断的设计决策。

在函数中存在生命周期省略,编译器根据函数参数中引用的生命周期来猜测结构的生命周期。

当你使用foo(&'a self) -> Struct<'a>时,生命周期只有一次(除了'static)。这是一种常见的情况,为了方便起见,Rust允许隐含这一点:foo(&self) -> Struct

结构中的引用定义没有被认为是通用的和明确的,也不足以避免生命周期,而拥有显式生命周期定义的愿望赢得了胜利。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50955374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档