【发布时间】:2015-12-17 10:11:15
【问题描述】:
我想编写一个分两步写入文件的程序。 在程序运行之前,该文件可能不存在。文件名是固定的。
问题是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");
}
【问题讨论】:
-
打开这个页面,Ctrl-F,“牛”,没有结果??虽然您不能返回对函数中创建的变量的引用,但您可以使用
std::borrow::Cow来概括拥有的数据和无主的引用——这是一个Deref,让您可以选择给定实例是拥有还是借用其数据。我发现它是在返回拥有和非拥有数据之间关闭的最可靠方法。