更新操作
到目前为止,我们仅实现了插入和检索操作。接下来,让我们看看如何扩展系统以提供更新操作功能。
旧版更新
在非线程化的系统版本中,更新操作相对直接: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
。