首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在泛型函数中“预期命名的生存期参数”

为什么在泛型函数中“预期命名的生存期参数”
EN

Stack Overflow用户
提问于 2021-10-24 09:15:42
回答 1查看 3.9K关注 0票数 4

如果我写这样的函数:

代码语言:javascript
复制
fn parse_json<'a, T: Deserialize<'a>>(s: &'a str) -> Vec<T> {
    serde_json::from_str(s).unwrap()
}

它如预期的那样工作。但是,如果我试图执行相同的w/o显式声明生命周期,如下所示:

代码语言:javascript
复制
fn parse_json<T: Deserialize>(s: &str) -> Vec<T> {
    serde_json::from_str(s).unwrap()
}

我得到一个编译器错误:

代码语言:javascript
复制
| fn parse_json<T: Deserialize>(s: &str) -> Vec<T> {
|                  ^^^^^^^^^^^ expected named lifetime parameter

为什么?在这种情况下,编译器是否需要显式生存期声明?

如果我没有使用泛型而是具体类型,就不需要显式声明任何生命周期:

代码语言:javascript
复制
fn parse_json(s: &str) -> Vec<MyStruct>   // that compiles file

我相信,这是因为所谓的生命周期省略规则。问题是,为什么带有泛型返回类型的版本也没有包含在省略规则中呢?

EN

回答 1

Stack Overflow用户

发布于 2021-10-31 01:08:50

生存期省略适用于函数参数和返回类型,但目前它不适用于特征边界(如T: Deserialize )。

为什么?在这种情况下,编译器是否需要显式的生存期声明?

我不确定,但总的来说,生命周期省略规则是相当有限的,大概是为了使它们更容易理解,并减少引入混乱的编译器“魔力”的机会。

请注意,泛型参数中支持生存期省略,但它是半推荐的(参见elided_lifetimes_in_paths lint):

代码语言:javascript
复制
struct Foo<'a>(&'a str);

// Compiles, but causes a warning with `#![warn(rust_2018_idioms)]`
fn bar1(s: &str) -> Foo { Foo(s) }

// Compiles, does not cause warning
fn bar2(s: &str) -> Foo<'_> { Foo(s) }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69695349

复制
相关文章

相似问题

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