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

时间:2014-09-11 00:31:45

标签: rust

在我的代码中,我有一个结构,用于在名为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 }如何让自己再次变异。

1 个答案:

答案 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
    },