gpt4 book ai didi

rust - 在bufreader.lines()的for循环后无法使用移动的BufReader

转载 作者:行者123 更新时间:2023-12-03 11:38:47 25 4
gpt4 key购买 nike

我试图从文件中读取一些行,跳过前几行并打印其余的行,但是在移动后,我不断收到有关已用值的错误:

use std::fs::File;
use std::io::{self, BufRead, BufReader, Read};
use std::path::Path;

fn skip_and_print_file(skip: &usize, path: &Path) {
let mut skip: usize = *skip;

if let Ok(file) = File::open(path) {
let mut buffer = BufReader::new(file);
for (index, line) in buffer.lines().enumerate() {
if index >= skip {
break;
}
}
print_to_stdout(&mut buffer);
}
}

fn print_to_stdout(mut input: &mut Read) {
let mut stdout = io::stdout();
io::copy(&mut input, &mut stdout);
}

fn main() {}

这是我得到的错误:

error[E0382]: use of moved value: `buffer`
--> src/main.rs:15:30
|
10 | for (index, line) in buffer.lines().enumerate() {
| ------ value moved here
...
15 | print_to_stdout(&mut buffer);
| ^^^^^^ value used here after move
|
= note: move occurs because `buffer` has type `std::io::BufReader<std::fs::File>`, which does not implement the `Copy` trait

最佳答案

作为Lukas Kalbertodt says,使用 Read::by_ref

这样可以防止lines使用BufReader,而是使用&mut BufReader。相同的逻辑applies to iterators

您可以使用 skip 来代替自己实现Iterator::take。但是,必须使用for循环将其驱动完成:

use std::{
fs::File,
io::{self, BufRead, BufReader, Read},
path::Path,
};

fn skip_and_print_file(skip: usize, path: impl AsRef<Path>) {
if let Ok(file) = File::open(path) {
let mut buffer = BufReader::new(file);

for _ in buffer.by_ref().lines().take(skip) {}
// Or: buffer.by_ref().lines().take(skip).for_each(drop);

print_to_stdout(buffer);
}
}

fn print_to_stdout(mut input: impl Read) {
let mut stdout = io::stdout();
io::copy(&mut input, &mut stdout).expect("Unable to copy");
}

fn main() {
skip_and_print_file(2, "/etc/hosts");
}

请注意,没有理由使 skip变量可变甚至传递引用。您还可以输入 AsRef<Path>,然后 skip_and_print_file的调用者可以只传递字符串文字。

关于rust - 在bufreader.lines()的for循环后无法使用移动的BufReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64399394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com