Rust: вставить uint в ссылку на hashmap

#rust #reference #hashmap #borrowing

#Ржавчина #ссылка #hashmap #заимствование

Вопрос:

Я новичок в Rust, и у меня есть эта ошибка во время компиляции, но я ее не понимаю

 error[E0614]: type `Option<u32>` cannot be dereferenced
 --> src/main.rs:9:5
  |
9 |     *mymap.insert("hello world", 0);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

Вот мой код, упрощенный для воспроизведения проблемы:

 use std::collections::HashMap;

fn main() {
    let mymap: HashMap<amp;str, u32> = HashMap::new();
    f(amp;mymap)
}

fn f(mymap: amp;HashMap<amp;str, u32>) {
    *mymap.insert("hello world", 0);
}
 

Также не работает следующее

 *mymap.insert("hello world", amp;0);
 

Я не нахожу основную причину своей проблемы, погуглив ее, я думаю, у меня нет слов. Похоже, какая-то проблема с заимствованием.

Ответ №1:

На самом деле вы не разыменовываете mymap , вы фактически разыменовываете результат insert() , потому что разыменование (т.Е. * ) Имеет более слабый приоритет, чем вызов метода.

Поэтому он жалуется на разыменование an Option<u32> , потому что это то, что insert() возвращается. Если бы вы действительно хотели разыменовать mymap , вам пришлось бы написать (*mymap).insert("hello world", 0); . Однако в Rust это не требуется.

Если вы удалите * тогда, вы получите вторую проблему, которая заключается в том, что вы пытаетесь мутировать mymap , что является неизменяемой ссылкой. Итак, чтобы иметь возможность вставлять, т. Е. Изменять mymap f , Вам нужно передать ему изменяемую ссылку, т. е. mymap: amp;mut HashMap<amp;str, u32> .

 use std::collections::HashMap;

fn main() {
    let mut mymap: HashMap<amp;str, u32> = HashMap::new();
    f(amp;mut mymap)
}

fn f(mymap: amp;mut HashMap<amp;str, u32>) {
    mymap.insert("hello world", 0);
}
 

Ответ №2:

Вам не нужно разыменовывать ссылки при вызовах методов, Rust автоматически сделает это за вас. Кроме того, вам нужно передать изменяемую ссылку mymap , чтобы вы действительно могли выполнить insert . Исправлен пример:

 use std::collections::HashMap;

fn main() {
    let mut mymap: HashMap<amp;str, u32> = HashMap::new();
    f(amp;mut mymap)
}

fn f(mymap: amp;mut HashMap<amp;str, u32>) {
    mymap.insert("hello world", 0);
}
 

игровая площадка

Комментарии:

1. Также спасибо за объяснение и игровую площадку 😉