#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
помощи