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不,你。这里最重要的是在第一个失败案例中使用了路径;错误消息不包括