小能豆

有什么方法可以返回对函数中创建的变量的引用吗?

rust

我想编写一个程序,分两步写入一个文件。在程序运行之前该文件可能不存在。文件名是固定的。

问题是这OpenOptions.new().write()可能会失败。在这种情况下,我想调用一个自定义函数trycreate()。这个想法是创建文件而不是打开它并返回句柄。由于文件名是固定的,trycreate()没有参数,我无法设置返回值的生命周期。

我该如何解决这个问题?

use std::io::Write;
use std::fs::OpenOptions;
use std::path::Path;

fn trycreate() -> &OpenOptions {
    let f = OpenOptions::new().write(true).open("foo.txt");
    let mut f = match f {
        Ok(file)  => file,
        Err(_)  => panic!("ERR"),
    };
    f
}

fn main() {
    {
        let f = OpenOptions::new().write(true).open(b"foo.txt");
        let mut f = match f {
            Ok(file)  => file,
            Err(_)  => trycreate("foo.txt"),
        };
        let buf = b"test1\n";
        let _ret = f.write(buf).unwrap();
    }
    println!("50%");
    {
        let f = OpenOptions::new().append(true).open("foo.txt");
        let mut f = match f {
            Ok(file)  => file,
            Err(_)  => panic!("append"),
        };
        let buf = b"test2\n";
        let _ret = f.write(buf).unwrap();
    }
    println!("Ok");
}

阅读 229

收藏
2024-05-21

共1个答案

小能豆

要解决这个问题,你可以将trycreate函数修改为返回一个Result,其中包含一个打开的文件句柄,或者一个错误信息。然后,在main函数中,根据trycreate的返回值决定如何处理文件的写入操作。

下面是修改后的代码示例:

use std::io::{Write, Result};
use std::fs::OpenOptions;

fn trycreate() -> Result<std::fs::File> {
    // 尝试以写入模式打开文件,如果文件不存在则创建它
    OpenOptions::new().write(true).create(true).open("foo.txt")
}

fn main() {
    // 尝试打开文件,如果文件不存在则创建它
    let f = match trycreate() {
        Ok(file) => file,
        Err(_) => panic!("Failed to create file"),
    };

    // 写入数据到文件
    let buf1 = b"test1\n";
    f.write_all(buf1).unwrap();
    println!("Wrote test1 to file");

    // 追加数据到文件
    let mut f = OpenOptions::new().append(true).open("foo.txt").unwrap();
    let buf2 = b"test2\n";
    f.write_all(buf2).unwrap();
    println!("Appended test2 to file");

    println!("Ok");
}

这个修改后的代码中,trycreate函数返回一个Result,其中包含一个打开的文件句柄或者一个错误。在main函数中,我们首先尝试调用trycreate函数来打开或创建文件。如果成功打开或创建了文件,我们就可以向文件中写入数据。如果失败,则程序会崩溃并打印出错误信息。

2024-05-21