File io 从文件读取时出现类型推断错误

File io 从文件读取时出现类型推断错误,file-io,rust,File Io,Rust,根据,我相信这是从文件中读取字符串的正确方法: use std::error::Error; fn main() { let path = std::path::Path::new("input.txt"); let file = match std::fs::File::open(&path) { Err(e) => { panic!("Failed to read file {}: {}",

根据,我相信这是从文件中读取字符串的正确方法:

use std::error::Error;

fn main() {
    let path = std::path::Path::new("input.txt");

    let file = match std::fs::File::open(&path) {
        Err(e) => {
            panic!("Failed to read file {}: {}",
                   path.display(),
                   e.description())
        }
    };

    let mut s = String::new();
    let mut v = Vec::new();
    match file.read_to_string(&mut s) {
        Err(e) => panic!("Failed to read file contents: {}", e.description()),
    }

    println!("{}", s);
}
但是这段代码使用Rust 1.17.0时产生了一个错误,所以我肯定遗漏了一些东西:

错误:此值的类型在此上下文中必须是已知的
-->src/main.rs:16:11
|
16 |匹配文件。读取到字符串(&mut s){
|           ^^^^^^^^^^^^^^^^^^^^^^^^^^^

您有多个重叠的问题。无论何时调试编程问题,都有助于创建一个新的解决方案

首先注释掉匹配文件的
。读取字符串(&mut s){/*…*/}
。然后您将得到另一个错误:

错误[E0282]:需要类型注释
-->src/main.rs:15:17
|
15 |设mut v=Vec::new();
|----^^^^^无法推断'T'的类型`
|         |
考虑给予“V”型
把这句话也注释掉,给出:

error[e004]:非详尽模式:`Ok(004)`未涵盖
-->src/main.rs:6:22
|
6 |让file=match std::fs::file::open(&path){
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^模式“Ok(^)`未涵盖
这是您真正的问题。是一个具有两个值的枚举,
Ok
Err
。您必须在匹配中处理所有变量

在这种情况下,最容易使用
unwrap\u或\u else

let file = std::fs::File::open("input.txt").unwrap_or_else(|e| {
    panic!(
        "Failed to read file {}: {}",
        path.display(),
        e.description()
    )
});
您可以删除未使用的向量,并将相同的
展开\u或\u else
应用于其他故障情况。然后您需要:

  • 导入
    std::io::Read
  • 文件
    声明为可变
  • 您还可以:

  • 使用
    {}
    直接打印错误
  • 将字符串片段传递给
    文件::open

  • 还可以将您的代码与进行比较。

    您有多个重叠的问题。无论何时调试编程问题,都有助于创建一个新的解决方案

    首先注释掉匹配文件的
    。读取字符串(&mut s){/*…*/}
    。然后您将得到另一个错误:

    错误[E0282]:需要类型注释
    -->src/main.rs:15:17
    |
    15 |设mut v=Vec::new();
    |----^^^^^无法推断'T'的类型`
    |         |
    考虑给予“V”型
    
    把这句话也注释掉,给出:

    error[e004]:非详尽模式:`Ok(004)`未涵盖
    -->src/main.rs:6:22
    |
    6 |让file=match std::fs::file::open(&path){
    |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^模式“Ok(^)`未涵盖
    
    这是您真正的问题。是一个具有两个值的枚举,
    Ok
    Err
    。您必须在匹配中处理所有变量

    在这种情况下,最容易使用
    unwrap\u或\u else

    let file = std::fs::File::open("input.txt").unwrap_or_else(|e| {
        panic!(
            "Failed to read file {}: {}",
            path.display(),
            e.description()
        )
    });
    
    您可以删除未使用的向量,并将相同的
    展开\u或\u else
    应用于其他故障情况。然后您需要:

  • 导入
    std::io::Read
  • 文件
    声明为可变
  • 您还可以:

  • 使用
    {}
    直接打印错误
  • 将字符串片段传递给
    文件::open

  • 同时将代码与进行比较。

    您缺少匹配的
    Ok
    分支。因此,匹配块表达式只能计算为panic!()这不是每个错误的“已知类型”。就是这样,谢谢!:)我想我在复制示例时应该更直截了当。如果你作为答案提交,我会接受它。@Turbulence编译器不应该在缺少匹配臂时抱怨吗?我怀疑编译器是在试图暂时忽略错误并提供更有用的di不可知,事实上报告了一个不太有用的错误。当您删除第二个
    匹配项
    (以及
    v
    的定义)时,编译器正确地用
    Ok(41;抱怨非穷举模式
    没有被涵盖。对吧!?我没有足够的能力解释到底发生了什么,这就是为什么我把我的解释留作评论。@user4815162342我认为编译器没有保留错误,这只是“正常的”类型推断。由于没有
    Ok
    大小写,因此无法推断
    文件的类型,因此首先报告错误。您缺少匹配的
    Ok
    分支。因此匹配块表达式只能计算为panic!()这不是每个错误的“已知类型”。就是这样,谢谢!:)我想我在复制示例时应该更直截了当。如果你作为答案提交,我会接受它。@Turbulence编译器不应该在缺少匹配臂时抱怨吗?我怀疑编译器是在试图暂时忽略错误并提供更有用的di不可知,事实上报告了一个不太有用的错误。当您删除第二个
    匹配项
    (以及
    v
    的定义)时,编译器正确地用
    Ok(41;抱怨非穷举模式
    没有被涵盖。对吧!?我没有足够的能力解释到底发生了什么,这就是为什么我把我的解释留作评论。@user4815162342我认为编译器没有保留错误,这只是“正常的”类型推断。由于没有
    Ok
    案例,因此无法推断
    文件的类型,因此首先报告错误。很抱歉包含
    let mut v=Vec::new()
    ,我正在尝试另一种方法来了解错误发生的原因,但在上传之前忘记了删除错误。感谢您提供的非常完整的响应和链接。:@Shepmaster只是想知道为什么您选择了
    *。unwrap\u或\u else()
    而不是
    *。expect().
    似乎包含特定错误消息
    |e |
    的作用不大,因为消息的文本讲述了故事。只是想知道
    .expect()
    是否更经济。或者您是否可以像
    文件中那样使用
    。读取字符串(&mut s)?;
    @krishnab不,你。这里最重要的是在第一个失败案例中使用了
    路径;错误消息不包括