Rust中迭代对象无法多次访问的问题解决咨询
Rust中正确遍历目录并复用DirEntry的方法
你的问题核心是所有权规则导致的:fs::read_dir返回的迭代器元素是Result<DirEntry>,每次调用d.unwrap()都会把这个Result对象消耗掉(Rust的移动语义),所以第一次if分支用了之后,else if里的d已经不存在了,自然编译报错。
正确的做法是先把Result解包一次,把DirEntry存到变量里,之后复用这个变量,而不是多次unwrap同一个Result。
修复后的基础版本
use std::fs; fn main() { for entry_result in fs::read_dir("./").unwrap() { // 先解包一次,把DirEntry存到entry变量里 let entry = entry_result.unwrap(); let path = entry.path(); if path.is_dir() { println!("目录: {:?}", path); } else if path.is_file() { println!("文件: {:?}", path); } } }
更严谨的错误处理版本(不推荐随便unwrap)
实际项目里最好不要直接用unwrap(),应该处理读取目录或条目失败的情况:
use std::fs; use std::io; fn main() -> io::Result<()> { for entry_result in fs::read_dir("./")? { let entry = entry_result?; let path = entry.path(); if path.is_dir() { println!("目录: {:?}", path); } else if path.is_file() { println!("文件: {:?}", path); } } Ok(()) }
额外补充:path.is_dir()和path.is_file()覆盖了常见的文件/目录场景,但系统中还存在符号链接、管道等特殊文件,若需要处理这类情况,可以添加else分支做对应逻辑。
内容的提问来源于stack exchange,提问作者Alexey Mirano
相关产品推荐
相关产品推荐

