使用 bufreader.lines() for 循环后不能使用移动的 BufReader [英] Cannot use moved BufReader after for loop with bufreader.lines()

查看:40
本文介绍了使用 bufreader.lines() for 循环后不能使用移动的 BufReader的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to read some lines from a file, skipping the first few and printing the rest, but I keep getting errors about used value after move:

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

推荐答案

为了避免搬家,请使用 Read::by_ref() 方法.这样,您只需借用BufReader:

In order to avoid the move, use the Read::by_ref() method. That way, you only borrow the BufReader:

for (index, line) in buffer.by_ref().lines().enumerate() { ... }
//                         ^^^^^^^^^
// you can still use `buffer` here

这篇关于使用 bufreader.lines() for 循环后不能使用移动的 BufReader的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆