微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在事件类型之间转换

如何解决在事件类型之间转换

关于如何正确比较来自frame_system::Module::events()的事件是否等于来自当前托盘decl_event!的特定事件的线索吗?

我尝试将列表中的事件与内部PostCreated事件进行匹配:

let events: Vec<EventRecord<<T as system::Trait>::Event,T::Hash>> = SystemModule::<T>::events();
        
events.iter().filter(|EventRecord { event,.. }| {
    matches!(event,RawEvent::PostCreated(_,_))
});

但是,出现错误

428 |             matches!(event,_))
    |                      -----  ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type,found enum `RawEvent`
    |                      |
    |                      this expression has type `&<T as frame_system::Trait>::Event`
    |
    = note: expected associated type `<T as frame_system::Trait>::Event`
                          found enum `RawEvent<_>`
    = help: consider constraining the associated type `<T as frame_system::Trait>::Event` to `RawEvent<_>`

此外,如果我将.into()添加到事件中,则会遇到另一个错误

428 |             matches!(event.into(),_))
    |                            ^^^^ the trait `std::convert::From<&<T as frame_system::Trait>::Event>` is not implemented for `RawEvent<_>`
    |
    = note: required because of the requirements on the impl of `std::convert::Into<RawEvent<_>>` for `&<T as frame_system::Trait>::Event`

我将不胜感激。确保这几行代码确实有问题。

解决方法

您的“一般”事件类型应在配置特征中定义如下:

/// The overarching event type.
type Event: From<Event<Self>> + Into<<Self as frame_system::Trait>::Event>;

这意味着我们支持托盘中定义的From枚举的Event特性,以及Into的{​​{1}}枚举的Event特性托盘。

因此转换可以如下:

  • 原始事件->通用事件
  • 一般事件->系统事件

所以:

frame_system

然后您可以将此let generic_event: <T as Trait>::Event = RawEvent::MyEvent.into(); let system_event: <T as frame_system::Trait>::Event = generic_event.into(); 与您从system_event返回的事件进行比较。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。