在模式匹配时修改结构的字段

Ben*_*ous 1 rust

在我的代码中,我有一个结构,用于在HashMap中为用户存储消息messages.在&mut self作为争论的函数内部,当我为用户找到消息时,我想修改此字段的值以删除这些消息,以便用户不会两次获得相同的消息.但是,我得到的错误是我无法借用self作为可变因为我在模式匹配开始时将它借用为不可变的.

match self.messages.find(&username) {
             Some(message_array) => {
               //do some stuff to send the messages
               self.messages.remove(&username);
             },
Run Code Online (Sandbox Code Playgroud)

我发现这个问题修改了一个字段,同时模式匹配,但是它接受的答案似乎没有解决我的问题 - 我不明白这条线&Tokenizer { state: InATag(*) } => { self.state = Outside }是如何让自己再次变异的.

win*_*ner 5

Rust提供HashMap::pop了您想要的容易:

match self.messages.pop(&username) {
    Some(message_array) => {
        // do some stuff to send the messages
        // entry for &username is already removed
    },
Run Code Online (Sandbox Code Playgroud)

你并没有真正修改结构的字段,而是匹配它,你匹配的结果find和尝试修改底层哈希表,Rust不会让你这样做因为那时message_array引用不会指向有效的位置了.message_array但是可以使用find_mut以下方法修改自身:

match self.messages.find_mut(&username) {
    Some(message_array) => {
        // do some stuff to send the messages
        message_array.truncate(0) // remove all messages
    },
Run Code Online (Sandbox Code Playgroud)