繁体   English   中英

rust main fn read dir result error cannot compile

[英]rust main fn read dir result error cannot compile

我是 rust 的新手,正在尝试一个例子来读取 Win10 上的目录:
https://rust-lang-nursery.github.io/rust-cookbook/file/dir.html

但是,由于返回结果需要 2 类型 arguments,代码无法编译:

std::io::Error  
std::time::SystemTimeError
use std::fs;

fn main() -> Result<()> {
    let current_dir = "C:/temp/";

    println!(
        "Entries modified in the last 24 hours in {:?}:",
        current_dir
    );

    for entry in fs::read_dir(current_dir)? {
        let entry = entry?;
        let path = entry.path();

        let metadata = fs::metadata(&path)?;
        let last_modified = metadata.modified()?.elapsed()?.as_secs();

        if last_modified < 24 * 3600 && metadata.is_file() {
            println!(
                "Last modified: {:?} seconds, is read only: {:?}, size: {:?} bytes, filename: {:?}",
                last_modified,
                metadata.permissions().readonly(),
                metadata.len(),
                path.file_name().ok_or("No filename")?
            );
        }
    }

    Ok(())
}

这是游乐场链接:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3af53ffa4d1cc6ae4c774f36514dd657

如果单击代码段右上角的“展开”按钮,您会看到默认情况下隐藏的位:

use error_chain::error_chain;

use std::{env, fs};

error_chain! {
    foreign_links {
        Io(std::io::Error);
        SystemTimeError(std::time::SystemTimeError);
    }
}

fn main() -> Result<()> {
   // ...

这些位原来是非常相关的,因为默认情况下 error_chain! 自动生成一个Result别名,这样你只需要指定 "Ok" 参数,另一个是生成的错误类型(类似于std::io::Result ,它是std::result::Result<T, std::io::Error>的 typedef std::result::Result<T, std::io::Error> )。

因此,您需要在复制代码片段之前对其进行扩展(操场上提供了error_chain )或手动滚动Result别名...以及可能的错误类型,尽管在这里您可以只定义type Result<T> = Result<T, Box<dyn std::error::Error>>它应该可以工作。

这种行为(食谱的)在关于页面的错误处理部分的注释中进行了解释,尽管我不能说我喜欢它,因为食谱通常不是您从头到尾阅读的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM