Rust serde泛型Deserialize生命周期错误:为何f1编译通过f2失败?
问题原因分析
错误的核心是生命周期约束与实际变量生命周期不匹配:
- 你在
f2函数签名中声明的生命周期'a是函数级生命周期,存活时间长于f2内部所有局部变量。给泛型T绑定的Deserialize<'a>约束表示:T反序列化时必须依赖一个存活周期为'a的输入数据源。 - 函数内部的
s_json是局部变量,函数执行结束时就会被销毁,它的生命周期远短于声明的'a,因此编译器会报错提示s_json的生命周期无法满足'a的要求。 f1可以正常编译的原因是:对于固定的具体类型Rec1,编译器可以自动推断它的反序列化不需要依赖输入字符串的生命周期(Rec1是值类型,反序列化时会把所有需要的数据拷贝到自身内存中,不会持有输入JSON字符串的引用),不存在生命周期冲突。
正确的函数写法
有两种等价的正确签名可选,都表示反序列化得到的类型完全持有自身数据,不会依赖输入数据源的生命周期,适合绝大多数反序列化得到独立值的场景:
- 使用
DeserializeOwnedtrait(更简洁,推荐):
use serde::de::DeserializeOwned; fn f2<T: DeserializeOwned>() { let s_json = "[]".to_string(); for i in 0..10 { let ve: Vec<T> = serde_json::from_str(&s_json).unwrap(); } }
- 使用更高阶生命周期约束(HRTB):
use serde::Deserialize; fn f2<T: for<'de> Deserialize<'de>>() { let s_json = "[]".to_string(); for i in 0..10 { let ve: Vec<T> = serde_json::from_str(&s_json).unwrap(); } }
内容的提问来源于stack exchange,提问作者at54321
相关产品推荐
相关产品推荐

