Извините, мой начинающий 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
, вещь, которую я хочу вернуть.