将 File 对象传递给函数的问题
Posted
技术标签:
【中文标题】将 File 对象传递给函数的问题【英文标题】:Issues passing File object to function 【发布时间】:2022-01-16 09:51:27 【问题描述】:我正在尝试读写传递File
对象的文件。它一直给我错误,说文件描述符无效。
这是否与 Rust 在内存中的工作方式有关?就像如果在下面做它不起作用,说在文件中找不到write_all
方法。我也尝试将其声明为 std::fs::File
但不起作用。
解决这个问题的方法是什么?我可以只传递文件名,但不断打开和关闭文件似乎很奇怪。
fn write_to_file(fd: File, data: &str)
fd.write_all(data.as_bytes()).expect("error writing");
fn main()
let filename = "testing.txt";
let mut fd = File::create(filename).expect("error creating file");
write_to_file(fd,"text to write");
【问题讨论】:
请包含您遇到的错误。 【参考方案1】:如果你想使用std::fs::File
的File::write_all()
函数,你需要在范围内使用std::io::Write
trait(在文档中你还会看到
use std::io::prelude::*;
)。除此之外,如果您想更改其内容,该文件必须是可变的。
我想这就是你想要的:
use std::fs::File;
use std::io::Write;
fn write_to_file(fd: &mut File, data: &str)
fd.write_all(data.as_bytes()).expect("error writing");
fn main()
let filename = "testing.txt";
let mut fd = File::create(filename).expect("error creating file");
write_to_file(&mut fd, "text to write");
还有link to the Playground。
【讨论】:
好的,谢谢,这解释了它,在我的主代码中,我使用 OpenOptions 打开文件并将其用作文件对象,因此我尝试了一个快速示例代码来传递文件对象,如代码中的和它没有用,但添加 mut 并包括 io crate 工作【参考方案2】:您试图在两个函数中使用 fd
,但您的代码告诉 Rust 明确禁止这样做,并将 fd
的存在一次限制为一个函数。
Rust 有一个单一所有权 的概念,这是File
等不可复制类型的默认设置。
当您有函数参数fd: File
时,这意味着该函数将接管fd
的独占所有权。
fd: &File
采用临时共享引用。它允许从多个地方访问同一个对象。
fd: &mut File
采用临时独占引用。这与传递所有权类似的排他性保证,只是当&mut
的范围结束时,所有权会自动归还给先前的所有者,而不是销毁对象。
因此,您需要传递对write_to_file
的临时引用(带有fd: &mut File
),而不是永远给它fd
(fd: File
)。
【讨论】:
以上是关于将 File 对象传递给函数的问题的主要内容,如果未能解决你的问题,请参考以下文章
将 multiprocessing.Value 对象传递给 ctype 函数?