【问题标题】:Why is returning a structure implementing a bound trait not allowed?为什么不允许返回实现绑定特征的结构?
【发布时间】:2023-02-22 13:09:09
【问题描述】:

你能解释一下生锈错误吗?

pub trait OrderEvent {}

#[derive(Debug)]
pub struct OrderCreatedEvent {
    pub order_id: String,
}

impl OrderEvent for OrderCreatedEvent {}

pub fn handle_create<E: OrderEvent>(_state: OrderState, command: CreateOrderCommand) -> Vec<E> {
    let events = vec![OrderCreatedEvent {
        order_id: command.order_id,
    }];

    events
}

铁锈告诉我:

mismatched types [E0308] expected type parameter `E`,
found struct `OrderCreatedEvent` Note: expected struct `Vec<E>` found struct `Vec<OrderCreatedEvent>`

Event 实现了 OrderEvent 特性并且它是特性绑定的。为什么不允许这样做?

【问题讨论】:

    标签: rust


    【解决方案1】:

    请改用此签名:

    pub fn handle_create(_state: OrderState, command: CreateOrderCommand) -> Vec<impl OrderEvent>
    

    在 Rust 中,使用 impl Trait 作为类型在参数类型和返回类型中具有相反的含义。见https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits

    【讨论】:

    • 谢谢!返回的 Vec 的类型签名是什么? let events: Vec&lt;impl _&gt; = handle_create(...)当然是错的。这也不正确let events: Vec&lt;dyn OrderEvent&gt;
    猜你喜欢
    • 2015-06-06
    • 2021-04-01
    • 2020-03-02
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多