rust - 在事件类型之间转换

标签 rust substrate

关于如何正确比较从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, RawEvent::PostCreated(_, _))
    |                      -----  ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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(), RawEvent::PostCreated(_, _))
    |                            ^^^^ 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托盘中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与您从frame_system::Module::<T>::events()返回的事件进行比较。

    关于rust - 在事件类型之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64199998/

    相关文章:

    rust - Rust引用Vec当前函数错误拥有的数据

    rust - 如何在基板模块中将 block 号转换为整数类型?

    rust - 是否有理由在 Substrate 中对特定类型使用通用特征?

    unit-testing - 如何在 ink 中设置来电者!契约(Contract)单元测试功能?

    Substrate 解析 mdns 数据包失败

    blockchain - 链下 worker 和签名交易

    rust - 为什么编译器报告错误的部分移动而不是移动?

    rust - 为什么 clap 添加到 Cargo.toml 时无法编译?

    rust - 在 OSX 中进行动态加载的段错误

    closures - 存储捕获返回值的闭包时存在冲突的生命周期要求