Почему моя переменная не живет достаточно долго?

У меня есть простая часть кода, которая должна читать файл в вектор по строкам

use std::io::{self, Read}; use std::fs::File; fn file_to_vec(filename: &str) -> Result<Vec, io::Error> { let mut file = try!(File::open(filename)); let mut string = String::new(); try!(file.read_to_string(&mut string)); string.replace("\r", ""); let data: Vec = string.split('\n').collect(); Ok(data) } fn main() {} 

Я получаю следующую ошибку:

 error[E0597]: `string` does not live long enough --> src/main.rs:10:27 | 10 | let data: Vec = string.split('\n').collect(); | ^^^^^^ does not live long enough ... 13 | } | - borrowed value only lives until here | note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 4:1... --> src/main.rs:4:1 | 4 | / fn file_to_vec(filename: &str) -> Result<Vec, io::Error> { 5 | | let mut file = try!(File::open(filename)); 6 | | let mut string = String::new(); 7 | | try!(file.read_to_string(&mut string)); ... | 12 | | Ok(data) 13 | | } | |_^ 

Почему я продолжаю получать эту ошибку? Как это исправить? Я предполагаю, что это имеет какое-то отношение к методу split .

Я мог бы вернуть строку, а затем разделить ее на Vec в основной функции, но я действительно хочу вернуть вектор.

Проблема в том, что string создается в вашей функции и будет уничтожена при возврате функции. Вектор, который вы хотите вернуть, содержит fragmentы string , но они не будут действительны вне вашей функции.

Если вас не сильно беспокоит производительность, вы можете вернуть Vec из своей функции. Вам просто нужно вернуть тип в Result, io::Error> и изменить строку

 let data: Vec<&str> = string.split('\n').collect(); 

в

 let data: Vec = string.split('\n').map(String::from).collect(); 
Interesting Posts

Программное открытие приложения настроек (iPhone)

Мерцающий черный экран после kb2919355 (Windows 8.1 Update 1) – нет доступа к ОС – нет безопасного режима – невозможно восстановить систему

Как предотвратить обман системы в MS Office (и других приложениях)

Возможно ли иметь BitLocker и FileVault на том же MacBoock Pro с Mac OS X Yosemite или El Capitan и Windows 10?

Есть ли простой способ заполнения раскрывающегося списка в этой схеме базы данных доступа?

Акриловые DNS-хосты не обновляются

Программная клавиатура изменяет размер фонового изображения на Android

ASP.NET MVC: управление сериализацией имен свойств с помощью JsonResult

Файлы rsync более 1 недели

Нет такого модуля «RestKit» с кокоаподами и быстрыми

Автозаполнение текстового поля в WPF

Как преобразовать серийный номер даты Excel в .NET DateTime?

Сопряжение эмуляторов Android и Wear

.htaccess или .htpasswd эквивалент IIS?

Перенаправление стандартного и выходного файла ошибки, добавляемого к одному и тому же лог-файлу

Давайте будем гением компьютера.