更新操作

到目前为止,我们仅实现了插入和检索操作。接下来,让我们看看如何扩展系统以提供更新操作功能。

旧版更新

在非线程化的系统版本中,更新操作相对直接:TicketStore暴露了一个get_mut方法,允许调用者获得对票据的可变引用,然后对其进行修改。

多线程更新

在当前的多线程版本中,相同的策略将不再适用,因为可变引用需要通过通道发送。借用检查器会阻止我们这样做,因为&mut Ticket不符合SyncSender::send所需的'static生命周期要求。

有几种方法可以绕过这个限制。我们将在接下来的练习中探讨其中的一些方法。

打补丁

我们无法通过通道发送&mut Ticket,因此无法在客户端进行修改。那我们能在服务器端进行修改吗?

如果告诉服务器需要更改的内容,就可以。换句话说,如果向服务器发送一个补丁

#![allow(unused)]
fn main() {
struct TicketPatch {
    id: TicketId,
    title: Option<TicketTitle>,
    description: Option<TicketDescription>,
    status: Option<TicketStatus>,
}
}

id字段是必需的,因为它用于标识需要更新的票据。所有其他字段都是可选的:

  • 如果一个字段是None,表示该字段不应被更改。
  • 如果一个字段是Some(value),表示该字段应更改为value