由于枚举结构与 Serde Deserialize 的冲突要求,无法为生命周期参数“de”推断出合适的生命周期
cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements for struct made of enums with Serde Deserialize
为什么我可以为我的 WidgetValue
枚举自动派生 serde::Deserialize
,但对于完全由 WidgetValue
字段组成的结构 不能 ?
这对我来说似乎违反直觉。
编辑:出于各种原因,我正在使用 WidgetValue 枚举,因为我想通过具有相同类型签名的函数发送不同的值。见, How do I create a heterogeneous collection of objects?等
serde = { version = "1.0.126", features = ["derive"] }
//works fine
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
Integer32(i32),
Unsized32(u32),
CString(&'static str),
}
//lifetime error
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub struct DraggableInfo{
parent: WidgetValue,
index: WidgetValue,
draggable_id: WidgetValue,
}
错误:
cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
您可以修复生命周期错误,方法是在反序列化期间手动提供 'de
生命周期的界限。
由于 &'static str
枚举 WidgetValue
仅实现 Deserialize<'static>
因为没有其他生命周期可以借用 &'static str
。这会导致 DraggableInfo
错误,因为默认情况下 'de
生命周期不受限制。通过本手册绑定,您声明 'de
比 'static
更长寿,使它们相等。
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
#[serde(bound(deserialize = "'de: 'static"))]
pub struct DraggableInfo{
parent: WidgetValue,
index: WidgetValue,
draggable_id: WidgetValue,
}
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
Integer32(i32),
Unsized32(u32),
CString(&'static str),
}
不过您可能不想这样使用它,因为您只能从 'static
数据中得出。您可以像这样 CString(Cow<'static, str>)
重新定义 CString
以允许静态字符串文字和从非静态数据反序列化。
为什么我可以为我的 WidgetValue
枚举自动派生 serde::Deserialize
,但对于完全由 WidgetValue
字段组成的结构 不能 ?
这对我来说似乎违反直觉。
编辑:出于各种原因,我正在使用 WidgetValue 枚举,因为我想通过具有相同类型签名的函数发送不同的值。见
serde = { version = "1.0.126", features = ["derive"] }
//works fine
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
Integer32(i32),
Unsized32(u32),
CString(&'static str),
}
//lifetime error
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub struct DraggableInfo{
parent: WidgetValue,
index: WidgetValue,
draggable_id: WidgetValue,
}
错误:
cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
您可以修复生命周期错误,方法是在反序列化期间手动提供 'de
生命周期的界限。
由于 &'static str
枚举 WidgetValue
仅实现 Deserialize<'static>
因为没有其他生命周期可以借用 &'static str
。这会导致 DraggableInfo
错误,因为默认情况下 'de
生命周期不受限制。通过本手册绑定,您声明 'de
比 'static
更长寿,使它们相等。
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
#[serde(bound(deserialize = "'de: 'static"))]
pub struct DraggableInfo{
parent: WidgetValue,
index: WidgetValue,
draggable_id: WidgetValue,
}
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
Integer32(i32),
Unsized32(u32),
CString(&'static str),
}
不过您可能不想这样使用它,因为您只能从 'static
数据中得出。您可以像这样 CString(Cow<'static, str>)
重新定义 CString
以允许静态字符串文字和从非静态数据反序列化。