在我的代码中,我有一个结构,用于在名为messages
的HashMap中为用户存储消息。在以&mut self
作为争论的函数内部,当我为用户找到消息时,我想修改此字段的值以删除这些消息,以便用户不会两次获得相同的消息。但是,我得到的错误是我无法借用self作为可变因为我在模式匹配开始时将它借用为不可变的。
match self.messages.find(&username) {
Some(message_array) => {
//do some stuff to send the messages
self.messages.remove(&username);
},
我发现了这个问题modifying a field while pattern matching on it,但是接受的答案似乎并没有解决我的问题 - 我不明白行&Tokenizer { state: InATag(*) } => { self.state = Outside }
如何让自己再次变异。
答案 0 :(得分: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
},
你并没有真正修改结构的字段,而是匹配它,你匹配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
},