Почему to_string()
вызывает borrowed value does not live long enough
Ошибка? Пример ниже:to_string() вызывает ошибку "заемное значение не проживает достаточно долго"
use std::collections::HashMap;
struct Foo {
id: Option<usize>,
name: String
}
fn main() {
let foos = getFoos();
for foo in foos {
let mut map = HashMap::new();
map.insert("name", &foo.name);
map.insert("id", &foo.id.unwrap().to_string());
}
}
fn getFoos() -> Vec<Foo> {
Vec::new()
}
Ошибка:
src/main.rs:15:27: 15:54 error: borrowed value does not live long enough
src/main.rs:15 map.insert("id", &foo.id.unwrap().to_string());
^~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:13:38: 16:6 note: reference must be valid for the block suffix following statement 0 at 13:37...
src/main.rs:13 let mut map = HashMap::new();
src/main.rs:14 map.insert("name", &foo.name);
src/main.rs:15 map.insert("id", &foo.id.unwrap().to_string());
src/main.rs:16 }
src/main.rs:15:9: 15:56 note: ...but borrowed value is only valid for the statement at 15:8
src/main.rs:15 map.insert("id", &foo.id.unwrap().to_string());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:15:9: 15:56 help: consider using a `let` binding to increase its lifetime
src/main.rs:15 map.insert("id", &foo.id.unwrap().to_string());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Почему компилятор предполагает создать промежуточное значение? Эта ошибка запутанна.
Вы принимаете ссылку на значение, генерируемое 'to_string'. Просто удалите '&' и ваш код будет работать: https://play.rust-lang.org/?gist=b41ea549d5b4add70559827b7d41e58a&version=stable&backtrace=0 –
Возможный дубликат [Возврат локальной строки в виде среза (& str)] (http: //stackoverflow.com/questions/29428227/return-local-string-as-a-slice-str) –
@ker Я не думаю, что это дубликат. Аналогично да, но все равно достаточно IMO :) –