【发布时间】:2021-06-28 00:36:57
【问题描述】:
我在我的应用程序中使用event_emmiter_rs 进行事件处理。该库允许您订阅带有回调的事件并触发这些事件。事件采用 (strings, value) 的形式,回调采用采用 value 参数的闭包形式。通过事件回调发送的值必须实现 Serde::Deserialize。 We can see this here in the docs。所以我创建了这个简单的设置:
use event_emitter_rs::EventEmitter;
use serde::Serialize;
use serde::Deserialize;
use std::borrow::Cow;
#[derive(Clone, Serialize, Deserialize, Debug)]
#[serde(bound(deserialize = "'de: 'static"))]
//#[serde(bound(deserialize = "'de: 'a"))] using the 'a lifetime gives same error
pub struct DraggableInfo<'a>{
parent: WidgetValue<'a>,
index: WidgetValue<'a>,
draggable_id: WidgetValue<'a>,
}
impl<'a> DraggableInfo<'a>{
pub fn new(parent: &'static str, index: u32, draggable_id: &'static str)->Self{
DraggableInfo{
parent: WidgetValue::CString(Cow::Borrowed(parent)),
index: WidgetValue::Unsized32(index),
draggable_id: WidgetValue::CString(Cow::Borrowed(draggable_id)),
}
}
}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub enum WidgetValue<'a>{
Integer32(i32),
Unsized32(u32),
CString(Cow<'a, str>)
}
fn main(){
let mut event_emitter = EventEmitter::new();
event_emitter.on("Print Draggable Value", |dragValue: DraggableInfo| {dbg!(dragValue);});
event_emitter.emit("Print Draggable Value", DraggableInfo::new("root", 0, "layer 1"));
}
但这会导致错误消息:
error: implementation of `Deserialize` is not general enough
--> src\main.rs:34:19
|
34 | event_emitter.on("Print Draggable Value", |dragValue: DraggableInfo| {dbg!(dragValue);});
| ^^ implementation of `Deserialize` is not general enough
|
= note: `DraggableInfo<'_>` must implement `Deserialize<'0>`, for any lifetime `'0`...
= note: ...but `DraggableInfo<'_>` actually implements `Deserialize<'1>`, for some specific lifetime `'1`
我不确定该消息所指的 Deserialize<'0> 和 Deserialize<'1> 生命周期是什么,或者当编译器说 impl “太笼统”时,它的确切含义是什么。我该如何解决这个错误?
【问题讨论】:
-
由于
de: 'static的限制,它不够通用。这意味着您只能从静态数据(即在程序的整个生命周期中存在的数据)进行反序列化。大概event_emitter处理比这更短的数据,这就是它抱怨的原因。 -
我认为这也可能是这种情况,但使用
#[serde(bound(deserialize = "'de: 'a"))]会出现同样的错误。 -
嗯,这仍然是一个约束。我不熟悉您使用的箱子,但您可能需要这些结构来拥有它们的数据,因为错误很明显,该类型需要在 any 生命周期内实现
Deserialize。跨度> -
我不太确定在这种情况下结构拥有它的数据意味着什么。我对生命的理解很差。您能否向我指出一篇说明您的建议的相关文章/答案?
-
我的意思是使用
String而不是Cow<'a, str>。