更新操作 (Update operations)
到目前为止我们只实现了插入和检索操作。
看看怎么把系统扩展为提供更新操作。
旧版的更新 (Legacy updates)
在系统的非线程版本里,更新相当直接:TicketStore 暴露了一个 get_mut 方法,允许调用方拿到工单的可变引用并修改它。
多线程下的更新 (Multithreaded updates)
同样的策略在当前的多线程版本里行不通。借用检查器会拦下我们:SyncSender<&mut Ticket> 不是 'static,因为 &mut Ticket 不满足 'static 生命周期,因此它们不能被传给 std::thread::spawn 的闭包捕获。
要绕开这个限制有几种方式。我们会在接下来的几个练习里探索其中几种。
打补丁 (Patching)
我们没法把 &mut Ticket 通过通道发送,所以无法在客户端侧进行修改。
那能不能在服务端侧修改?
可以——只要我们告诉服务端要改什么。换言之,给服务端发送一个补丁 (patch):
struct TicketPatch {
id: TicketId,
title: Option<TicketTitle>,
description: Option<TicketDescription>,
status: Option<TicketStatus>,
}
id 字段是必需的,因为它用来识别要更新哪张工单。
其他字段都是可选的:
- 如果某字段为
None,意味着该字段不应被改变。 - 如果某字段为
Some(value),意味着该字段应被改为value。
原文链接:英文原文