Ржавчина — как вернуть значение из хэш-карты

#rust

#Ржавчина

Вопрос:

Вот небольшая функция:

 pub fn test_return_value() -gt; Boxlt;dyn RoomInterfacegt; {  let mut r = HashMap::lt;String, Boxlt;dyn RoomInterfacegt;gt;::new();  // blah blah blah, do stuff with the HashMap  r.get("test_key").unwrap() }  

Это не компилируется и говорит:

 37 | pub fn test_return_value() -gt; Boxlt;dyn RoomInterfacegt; {  | ---------------------- expected `Boxlt;(dyn room::RoomInterface   'static)gt;` because of return type 38 | let mut r = HashMap::lt;String, Boxlt;dyn RoomInterfacegt;gt;::new(); 39 | r.get("test_key").unwrap()  | ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Box`, found reference  

Что означает эта ошибка? Как вернуть значение, сохраненное в хэш-карте?

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

1. Теперь там написано «ожидаемый именованный параметр времени жизни». Если я добавлю один, он скажет «не может возвращать значение, ссылающееся на локальную переменную r «. Я все еще обдумываю эту проблему на всю жизнь-что делать в данном конкретном случае?

2. Это не может работать так, как написано. Вы создаете хэш-карту внутри функции и возвращаете ссылку на значение внутри этой хэш-карты при возврате. Хеш-карта уничтожается при возврате, что создаст висячую ссылку в виде возвращаемого значения. Компилятор предотвратит это, даже если вы исправите синтаксическую ошибку.

3. Давайте сделаем шаг назад. HashMap::get дает необязательную ссылку на значение в хэш-карте. Вы не можете вернуть это как принадлежащее Box , так как оно вам не принадлежит — это делает хэш-карта. Возврат ссылки также не сработает, потому что, хотя теперь вы не пытаетесь украсть собственность, вещь, на которую вы ссылаетесь, живет недостаточно долго. Вам либо нужно, чтобы remove элемент из хэш-карты стал владельцем, либо хэш-карта должна прожить достаточно долго, чтобы вызывающий мог ее использовать. Неясно, к чему вы клоните.

4. Могу ли я каким-то образом клонировать значение в хэш-карте? Неужели это действительно не может концептуально сработать?

5. GManNickG, используя remove вместо «получить помощь». Спасибо!

Ответ №1:

Использование remove вместо get помощи