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请求给服务器,请求更新数据,看来这两个是完全有共通之处的!

 

阅读剩余
THE END