首页 > 解决方案 > 错误:使用移动值:`path`。如何更正此代码?

问题描述

编译代码时出现此错误:请帮助我。

使用移动值:`path`

在 moverustc(E0382) 之后使用的值
main.rs(16, 9):移动发生是因为 `path` 的类型为 `std::result::Result`,它没有实现 `Copy` trait
main.rs(18, 32): `path` 由于这个方法调用而移动
main.rs(19, 29): 移动后这里使用的值

fn main() -> std::io::Result<()>  {
    let paths = fs::read_dir("./").unwrap();

    let mut text = String::new();
    let mut idx = 0;
    for path in paths {
        // let path_str = path.unwrap().path().display().to_string();
        let path_str = if path.unwrap().path().is_dir()  {
                            path.unwrap().path().display().to_string() 
                        } 
                       else {
                           let mut path = path.unwrap().path().display().to_string();
                           path.push_str("[file]");
                           path
                        };
        
        let path_trimed = path_str.trim_start_matches("./");
        idx += 1;
        println!("{} -> file/folder: {}", idx + 1, path_trimed);
        text.push_str(&path_trimed);
        text.push_str("\n");
    }
    // println!("{}", text);

    // writing the string to file
    let mut file = fs::File::create("file_list.txt")?;
    file.write_all(&text.as_bytes())?;
    Ok(())
}

标签: rust

解决方案


我认为问题在于您多次解包路径,每次解包都借用变量路径,因此当您尝试第二次解包时生锈会抱怨。我建议你尝试只打开一次:

use std::fs;
use std::io::Write;

fn main() -> std::io::Result<()> {
    let paths = fs::read_dir("./").unwrap();
    let mut text = String::new();
    let mut idx = 0;
    for path in paths {
        // let path_str = path.unwrap().path().display().to_string();
        let path = path.unwrap().path();
        let path_str = if path.is_dir() {
            path.display().to_string()
        } else {
            let mut path = path.display().to_string();
            path.push_str("[file]");
            path
        };
        let path_trimed = path_str.trim_start_matches("./");
        idx += 1;
        println!("{} -> file/folder: {}", idx + 1, path_trimed);
        text.push_str(&path_trimed);
        text.push_str("\n");
    }
    // println!("{}", text);
    // writing the string to file
    let mut file = fs::File::create("file_list.txt")?;
    file.write_all(&text.as_bytes())?;
    Ok(())
}

推荐阅读