Структура, содержащая ссылку на файл в Rust, не заимствует - PullRequest
0 голосов
/ 29 апреля 2019

Не уверен, что мне здесь не хватает, объявлено время жизни, поэтому структура должна использовать путь для создания файла и вернуть Struct со ссылкой на изменяемый файл, чтобы я мог позже вызывать оболочку «write». .

use std::path::Path;
use std::fs::File;
// use std::io::Write;

#[derive(Debug)]
pub struct Foo<'a> {
    file: &'a mut File,
}

impl<'a> Foo<'a> {
    pub fn new(path: &'a Path) -> Result<Self, std::io::Error> {
        let mut f: &'a File = &File::create(path)?;

        Ok(Self { file: &mut f })
    }

    //pub fn write(&self, b: [u8]) {
    //    self.file.write(b);
    //}
}

Ошибка:

   | impl<'a> Foo<'a> {
   |      -- lifetime `'a` defined here
11 |     pub fn new(path: &'a Path) -> Result<Self, std::io::Error> {
12 |         let mut f: &'a File = &File::create(path)?;
   |                    --------    ^^^^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
   |                    |
   |                    type annotation requires that borrow lasts for `'a`
...
15 |     }
   |     - temporary value is freed at the end of this statement

1 Ответ

0 голосов
/ 30 апреля 2019

Как уже упоминалось @ E_net4, мне не нужна изменяемая ссылка, но я хочу владеть значением. Вместо того, чтобы пытаться играть с временами жизни, я могу просто владеть файлом и обрабатывать всю структуру как изменчивую при попытке записи в файл!

use std::path::{ PathBuf };
use std::fs::File;
use std::io::Write;
use std::env;


#[derive(Debug)]
pub struct Foo {
    file:  File,
}

impl Foo {
    pub fn new(path: PathBuf) -> Self {
        Self { 
          file: File::create(path).unwrap(),
        }
    }

    pub fn write(&mut self, b: &[u8]) -> Result<usize, std::io::Error> {
        self.file.write(b)
    }
}

fn main() {
    let mut tmp_dir = env::temp_dir();
    tmp_dir.push("foo23");
    let mut f = Foo::new(tmp_dir);

    f.write(b"test2").unwrap();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...