75、打补丁
更新操作
到目前为止,我们值实现了插入和检索操作。让我看一下如何拓展系统,使其支持更新操作。
传统的更新
在单线程系统中,更新操作相当直观:TIcketStore提供一个get_mut方法,允许调用者获取一个可变的ticket引用,然后直接修改。
多线程更新
同样的操作方式在多线程版本中就不行。借用检查器会阻止我们: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字段是必填字段,因为它需要识别需要更新的ticket。
其他字段都是可选的:
- 如果字段为
None,就意味着这个字段不需要进行更新。 - 如果字段为
Some(value),就代表着这个字段应该被更改为value。
话说真像正儿八经的客户端服务器,客户端通过发送PATCH请求给服务器,请求更新数据,看来这两个是完全有共通之处的!
阅读剩余
版权声明:
作者:CN059
链接:https://www.cn059.com/2025/11/19/75%e3%80%81%e6%89%93%e8%a1%a5%e4%b8%81.html
文章版权归作者所有,未经允许请勿转载。
THE END
