#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. Также спасибо за объяснение и игровую площадку 😉