Неизменный заем происходит при получении из HashSet - PullRequest
0 голосов
/ 12 октября 2019
let mut set = HashSet::<u32>::new();

let a = set.get(&1);
set.remove(&1);
a.unwrap(); // cannot borrow `set` as mutable because it is also borrowed as immutable

Вот мой код. Я вижу, что означает ошибка и почему ржавчина мешает мне это делать. Но я не могу найти аннотации типов в set.rs, чтобы эта ошибка произошла.

 pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
        where T: Borrow<Q>,
              Q: Hash + Eq

Это объявление set.get, но я не вижу ничего релевантного.

1 Ответ

0 голосов
/ 12 октября 2019

Важной частью get является следующее: -> Option<&T>.

Вопреки тому, что вы, кажется, считаете, этот метод дает вам ссылку , а не фактический объект(и при этом также устанавливается неизменный заем на предмет). В результате, когда вы затем remove() используете указанный объект (и получаете изменяемый заем над коллекцией), ссылка, очевидно, немедленно становится недействительной, и в результате вы не можете unwrap() *.

Возможно, вы ищете take() элемент set вместо get(). Это вернет объект и удалит элемент из набора вместо возврата ссылки;это также означает, что вам больше не понадобится звонить на remove() ( детская площадка ):

let mut set = HashSet::<u32>::new();
set.insert(1);
let a = set.take(&1).unwrap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...