如果我写了这样的一个函数:
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
为什么?编译器在这种情况下要求显式生命周期声明,是否有原因?
如果我使用的不是泛型而是具体类型,则不需要明确声明任何生命周期:
fn parse_json(s: &str) -> Vec<MyStruct> // that compiles file
我认为这是由于所谓的 生命周期省略规则导致的。问题是,为什么具有通用返回类型的版本也不受省略规则的覆盖呢?
Deserialze<'a>
。此时,您还必须说明引用的生命周期与泛型参数相同,因此也需要显式地声明它们。 - JmbMyStruct
不是一个引用。 - user4815162342