Я хочу построить строку s
путем итерации по вектору простых структур, добавляя различные строки в acc
в зависимости от структуры.Складывание ссылок внутри совпадений приводит к ошибке времени жизни
#[derive(Clone, Debug)]
struct Point(Option<i32>, Option<i32>);
impl Point {
fn get_first(&self) -> Option<i32> {
self.0
}
}
fn main() {
let mut vec = vec![Point(None, None); 10];
vec[5] = Point(Some(1), Some(1));
let s: String = vec.iter().fold(
String::new(),
|acc, &ref e| acc + match e.get_first() {
None => "",
Some(ref content) => &content.to_string()
}
);
println!("{}", s);
}
Запуск этот код приводит к следующей ошибке:
error: borrowed value does not live long enough
Some(ref content) => &content.to_string()
^~~~~~~~~~~~~~~~~~~
note: reference must be valid for the expression at 21:22...
|acc, &ref e| acc + match e.get_first() {
^
note: ...but borrowed value is only valid for the expression at 23:33
Some(ref content) => &content.to_string()
^~~~~~~~~~~~~~~~~~~~
Проблема заключается в том, что время жизни &str
я создаю, кажется, немедленно прекратить. Однако, если to_string()
вернул бы &str
в первую очередь, компилятор не пожаловался бы. Тогда в чем же разница?
Как я могу заставить компилятор понять, что я хочу, чтобы ссылки на строки поддерживались до тех пор, пока я создаю s
?
(FYI: Перемещение 'acc +' в каждую ветку работает: https://play.rust-lang.org/?gist=95adc6ff8736d21b941a8a89ef67f582&version=stable&backtrace=0.) – Dogbert
Да, это так. Должно быть, это последнее, что я не пробовал, прежде чем делать это сообщение. но почему? – lsund
Это потому, что время жизни acc больше, чем утверждение соответствия. Новая строка, построенная в матче, живет только внутри своего блока. – ljedrz