如果我写这样的函数:
fn parse_json<'a, T: Deserialize<'a>>(s: &'a str) -> Vec<T> {
serde_json::from_str(s).unwrap()
}它如预期的那样工作。但是,如果我试图执行相同的w/o显式声明生命周期,如下所示:
fn parse_json<T: Deserialize>(s: &str) -> Vec<T> {
serde_json::from_str(s).unwrap()
}我得到一个编译器错误:
| fn parse_json<T: Deserialize>(s: &str) -> Vec<T> {
| ^^^^^^^^^^^ expected named lifetime parameter为什么?在这种情况下,编译器是否需要显式生存期声明?
如果我没有使用泛型而是具体类型,就不需要显式声明任何生命周期:
fn parse_json(s: &str) -> Vec<MyStruct> // that compiles file我相信,这是因为所谓的生命周期省略规则。问题是,为什么带有泛型返回类型的版本也没有包含在省略规则中呢?
发布于 2021-10-31 01:08:50
生存期省略适用于函数参数和返回类型,但目前它不适用于特征边界(如T: Deserialize )。
为什么?在这种情况下,编译器是否需要显式的生存期声明?
我不确定,但总的来说,生命周期省略规则是相当有限的,大概是为了使它们更容易理解,并减少引入混乱的编译器“魔力”的机会。
请注意,泛型参数中支持生存期省略,但它是半推荐的(参见elided_lifetimes_in_paths lint):
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) }https://stackoverflow.com/questions/69695349
复制相似问题