将 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::FileFile::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),而不是永远给它fdfd: File)。

【讨论】:

以上是关于将 File 对象传递给函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

将整数参数传递给 C 中的主函数

将对象参数传递给主函数 Java

将 multiprocessing.Value 对象传递给 ctype 函数?

(Python) 将 Playwright Page 对象传递给包装函数的函数装饰器

C ++将多个对象传递给线程中的函数

将对象作为参数传递给函数