此问题在此处已有答案:
Rust and serde deserializing using generics(2个答案)
6天前关门了。
我们有一个向量Vec<u8>
,我们希望将其反序列化为T
类型。我们能想到的最小复制例子是
fn wrapper<'de, T>(vec: Vec<u8>) -> Result<T, serde_json::Error>
where
T: serde::Deserialize<'de>,
{
serde_json::from_slice::<'de, T>(&vec)
}
字符串
但是,编译器给出以下错误:
error[E0597]: `vec` does not live long enough
--> src/wrapper.rs:128:38
|
124 | fn wrapper<'de, T>(vec: Vec<u8>) -> Result<T, serde_json::Error>
| --- lifetime `'de` defined here
...
128 | serde_json::from_slice::<'de, T>(&vec)
| ---------------------------------^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `vec` is borrowed for `'de`
129 | }
| - `vec` dropped here while still borrowed
型
由于我们拥有向量的全部所有权,并且类型T
没有对任何原始数据的引用(例如它可能是一个数字或String
),我被难倒了,是什么导致这个错误。
我仍然得到相同的错误与以下更改:
serde::Deserialize<'static>
个serde::Deserialize<'de> + 'static
个serde::Deserialize<'de> + 'de
个
1条答案
按热度按时间jdgnovmf1#
我找到了解决办法
字符串
来自Rust的文档
性状界限可以在生命周期中排名更高。这些界限指定了一个对所有生存期都为真的界限。
因此,这里的解决方案是将特征绑定到所有生命周期,而不是特定的生命周期。包括函数本身的生存期,也就是
vec
的生存期。