使用BufReader读取Rust中的JSON文件时出错:trait绑定结果:std::io::Read未满足要求

使用BufReader读取Rust中的JSON文件时出错:trait绑定结果:std::io::Read未满足要求,json,file-io,rust,Json,File Io,Rust,我正在尝试从文件中读取JSON: 使用std::error::error; 使用std::fs::File; 使用std::io::BufReader; 使用std::path::path; impl参数{ pub fn new(原始选项2:opt::opt,路径:String)->Self{ //使用缓冲区以只读模式打开文件。 让file=file::open(路径); 让reader=BufReader::new(文件); 自我{ opt_原始:原始opt2, 模块设置:serde_json

我正在尝试从文件中读取JSON:

使用std::error::error;
使用std::fs::File;
使用std::io::BufReader;
使用std::path::path;
impl参数{
pub fn new(原始选项2:opt::opt,路径:String)->Self{
//使用缓冲区以只读模式打开文件。
让file=file::open(路径);
让reader=BufReader::new(文件);
自我{
opt_原始:原始opt2,
模块设置:serde_json::from_reader(reader).unwrap(),
}
}
}
但我有一个错误:

error[E0277]:未满足特性绑定'std::result::result:std::io::Read'
-->src\params.rs:20:37
|
20 | let reader=BufReader::new(文件);
|^^^^特性'std::io::Read'未为'std::result::result'实现`
|
=注意:`std::io::BufReader:::new所需`
该操作返回一个-表示打开的操作可能成功或失败

与许多其他语言相比,这是Rust的一个突出特征;它试图迫使你处理错误。而不是:

  • C-只返回一个int
  • Python-异常(try:finally:)
  • C++异常(需要libstdc++运行时)
正如您所期望的,这会在开始时带来更多的编程时间,但总的来说,麻烦会少很多,程序质量也会更高

let file=file::open(path)行之后您必须处理结果

如果您不在乎,并且在文件无法打开时想使程序崩溃,请执行以下操作:

let file = File::open(path).unwrap();
要在崩溃中生成更好的错误消息,请执行以下操作:

let file = File::open(path).expect("Unable to open file");
为妥善处理此事—

最可能的情况是,您希望自己从函数返回一个
结果。然后你可以这样重写它(使用a):

impl参数{
pub fn new(原始opt2:opt::opt,路径:String)->Result{
//使用缓冲区以只读模式打开文件。
匹配文件::打开(路径){
确定(文件)=>{
让reader=BufReader::new(文件);
好(自我){
opt_原始:原始opt2,
模块设置:serde_json::from_reader(reader).unwrap(),
})
}
Err(Err)=>Err(Err),
}
}
}
。。或者更实用的方式:

impl Params {
    pub fn new(raw_opt2: opt::Opt, path: String) -> Result<Self, std::io::Error> {
        // Open the file in read-only mode with buffer.
        File::open(path).map(|file| {
            let reader = BufReader::new(file);
            Self {
                opt_raw: raw_opt2,
                module_settings: serde_json::from_reader(reader).unwrap(),
            }
        })
    }
}
impl参数{
pub fn new(原始opt2:opt::opt,路径:String)->Result{
//使用缓冲区以只读模式打开文件。
文件::打开(路径).map(|文件|{
让reader=BufReader::new(文件);
自我{
opt_原始:原始opt2,
模块设置:serde_json::from_reader(reader).unwrap(),
}
})
}
}
更新: 现在,我通常使用这两个库进行错误管理:

  • 当我编写库并创建自己的错误类型时
  • 在编写应用程序、脚本或测试时,可以轻松处理所有库错误
。。当然,我没有提到,这使得处理结果和选项变得更加容易。

操作返回a-表示打开的操作可能成功或失败

与许多其他语言相比,这是Rust的一个突出特征;它试图迫使你处理错误。而不是:

  • C-只返回一个int
  • Python-异常(try:finally:)
  • C++异常(需要libstdc++运行时)
正如您所期望的,这会在开始时带来更多的编程时间,但总的来说,麻烦会少很多,程序质量也会更高

let file=file::open(path)行之后您必须处理结果

如果您不在乎,并且在文件无法打开时想使程序崩溃,请执行以下操作:

let file = File::open(path).unwrap();
要在崩溃中生成更好的错误消息,请执行以下操作:

let file = File::open(path).expect("Unable to open file");
为妥善处理此事—

最可能的情况是,您希望自己从函数返回一个
结果。然后你可以这样重写它(使用a):

impl参数{
pub fn new(原始opt2:opt::opt,路径:String)->Result{
//使用缓冲区以只读模式打开文件。
匹配文件::打开(路径){
确定(文件)=>{
让reader=BufReader::new(文件);
好(自我){
opt_原始:原始opt2,
模块设置:serde_json::from_reader(reader).unwrap(),
})
}
Err(Err)=>Err(Err),
}
}
}
。。或者更实用的方式:

impl Params {
    pub fn new(raw_opt2: opt::Opt, path: String) -> Result<Self, std::io::Error> {
        // Open the file in read-only mode with buffer.
        File::open(path).map(|file| {
            let reader = BufReader::new(file);
            Self {
                opt_raw: raw_opt2,
                module_settings: serde_json::from_reader(reader).unwrap(),
            }
        })
    }
}
impl参数{
pub fn new(原始opt2:opt::opt,路径:String)->Result{
//使用缓冲区以只读模式打开文件。
文件::打开(路径).map(|文件|{
让reader=BufReader::new(文件);
自我{
opt_原始:原始opt2,
模块设置:serde_json::from_reader(reader).unwrap(),
}
})
}
}
更新: 现在,我通常使用这两个库进行错误管理:

  • 当我编写库并创建自己的错误类型时
  • 在编写应用程序、脚本或测试时,可以轻松处理所有库错误
。。当然,我没有提到,这使得处理结果和选项变得更加容易