Борьба с висячими ссылками и предложениями для stati c продолжительности жизни в Rust - PullRequest
0 голосов
/ 21 февраля 2020

Извините, мой начинающий Rust-ing. Я написал функцию для очистки файла и проверил, что логика c функции выглядит нормально. Затем я хотел переименовать эту функцию из основной в вспомогательную функцию. Я знаю, что я мог бы сохранить некоторые вещи ввода-вывода в основной функции, но ради забавы, скажем, я хочу сохранить весь код ниже в вспомогательной функции.

Код ниже будет скомпилирован, если мы изменим тип возвращаемого значения на Result<(), std::io::Error> и изменим последнюю строку, чтобы получить Ok(()). Hovewer, этот код не. Компилятор предлагает изменить &str на &'static str, хотя это изменение, похоже, не поможет, поскольку компилятор тогда говорит, что «E0277, main может возвращать только типы, которые реализуют завершение»

И в этот момент я начинаю рушиться при недостаточном понимании того, как избежать висящих ссылок.

fn main() -> Result<Vec<&str>, std::io::Error> {
    let file = File::open("22names.txt")?;
    let mut buf_reader = BufReader::new(file);
    let mut contents = String::new();
    buf_reader.read_to_string(&mut contents)?;

    contents.retain(|c| c != '"');
    let v: Vec<&str> = contents.split(',').collect();

    println!("first 10 indices of v are: {:?}", &v[..10]);

    Ok(v)
}

Редактировать: Если я изменяю вышеизложенное, переименовываю main в произвольную функцию f и вызываю f из новой главной функции и присваиваю результат переменной, let v = f() Я получаю следующая ошибка, которая возникает из-за того, что contents выходит из области видимости. Как мне сохранить contents в области, или, вернее, вектор v, который указывает на это? ошибка [E0515]: невозможно вернуть значение, ссылающееся на локальную переменную contents, где на contents ссылается v, вещь, которую я хочу вернуть.

1 Ответ

1 голос
/ 22 февраля 2020

Основная функция - это точка входа в вашу программу. Поскольку эта функция выполняется первым, никакая другая функция не вызывала ее. Ваша программа завершает работу после возврата основной функции. Возвращаемое значение основной функции используется для определения состояния выхода вашей программы. Из-за этого никакая другая функция не может использовать возвращаемое значение main. Я предлагаю переименовать вашу функцию.

Другая ошибка возникает из-за того, что вы возвращаете фрагменты строки. Content содержит данные, которые вы читаете из файла, а v содержит только ссылки на эти данные. После выхода content из области памяти освобождается. Это приведет к v, содержащему недопустимые указатели. Компилятор не допустит этого.

Вы можете вернуть String вместо &str. String владеет базовыми данными. Для этого вы должны изменить сигнатуру функции на fn helper() -> Result<Vec<String>, std::io::Error>. Вам, чем нужно было бы преобразовать свой Vec<&str> в Vec<String>. Вы можете сделать это, используя String::from вот так:

let v: Vec<String> = contents.split(',').map(String::from).collect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...