【发布时间】:2021-10-24 09:15:42
【问题描述】:
如果我写一个这样的函数:
fn parse_json<'a, T: Deserialize<'a>>(s: &'a str) -> Vec<T> {
serde_json::from_str(s).unwrap()
}
它按预期工作。 但是,如果我尝试在不明确声明生命周期的情况下做同样的事情,就像这样:
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
为什么?在这种情况下,编译器是否有理由要求 explicit 生命周期声明?
如果我没有使用泛型而是具体类型,我就不需要显式声明任何生命周期:
fn parse_json(s: &str) -> Vec<MyStruct> // that compiles file
我相信,这是由于所谓的终身省略规则。问题是,为什么具有通用返回类型的版本不被省略规则覆盖?
【问题讨论】:
-
因为编译还没猜到
-
因为生命周期省略规则只适用于references,不适用于泛型参数,所以必须写
Deserialze<'a>。此时您还必须说引用的生命周期与泛型参数相同,因此您也需要明确声明它们。 -
@Jmb 它似乎也适用于其他类型的生命周期,例如this compiles 即使
MyStruct不是参考。