Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 强制io::stdio和BufReader之间的BufRead特性兼容性_Rust - Fatal编程技术网

Rust 强制io::stdio和BufReader之间的BufRead特性兼容性

Rust 强制io::stdio和BufReader之间的BufRead特性兼容性,rust,Rust,我正在尝试键入pun一个io::stdio实例和一个BufReader包装一个文件,这样我就可以在假定缓冲输入源的情况下编写代码。我尝试了几种尝试将io::stdio()强制转换为BufRead类型的变体,但都失败了,出现了以下一种或多种变体: error: mismatched types: expected `std::io::stdio::StdinLock<'_>`, found `std::io::buffered::BufReader<std::fs::F

我正在尝试键入pun一个
io::stdio
实例和一个
BufReader
包装一个文件,这样我就可以在假定缓冲输入源的情况下编写代码。我尝试了几种尝试将
io::stdio()
强制转换为
BufRead
类型的变体,但都失败了,出现了以下一种或多种变体:

error: mismatched types:
 expected `std::io::stdio::StdinLock<'_>`,
    found `std::io::buffered::BufReader<std::fs::File>`
(expected struct `std::io::stdio::StdinLock`,
    found struct `std::io::buffered::BufReader`) [E0308]
csv_to_json.rs:26     reader = BufReader::new(file.unwrap());
错误:不匹配的类型:
应为'std::io::stdio::StdinLock 1'{
用法();
出口(1);
}如果args.len()==1,则为else{
让file=file::open(args[0].clone());
if!file.is_ok(){
用法();
出口(1);
}
reader=BufReader::new(file.unwrap());//重新分配。这是失败的一行。
}
//其余的代码与读取器一起工作,假定输入源是缓冲的。
}
我尝试过的事情:

let mut reader : BufRead = io::stdin();  // Fails.
let mut reader : BufReader<Read> = io::stdin();  // Fails.
let mut reader : BufReader<_> = io::stdin(); // Fails
let mut reader : BufRead = io::stdin().lock(); // Fails later.
let mut reader = BufReader::new(io::stdin());  // Fails with type mismatch.
let mut reader = BufReader::new(io::stdin().lock());  // Fails with type mismatch.
let mut reader:BufRead=io::stdin();//失败。
让mut读取器:BufReader=io::stdin();//失败。
让mut读取器:BufReader=io::stdin();//失败
让mut读取器:BufRead=io::stdin().lock();//后来失败了。
让mut reader=BufReader::new(io::stdin());//由于类型不匹配而失败。
让mut reader=BufReader::new(io::stdin().lock());//由于类型不匹配而失败。

我甚至尝试将代码提取到它自己的函数中,返回类型签名失败,出现类似的错误情况。我如何创建一个“reader”变量,它是
stdio
上的
BufferedReader
或者
BufferedReader
文件上的

如果确实需要,则
reader
变量必须是:

trait对象的装箱形式允许避免附加变量
bufread

let stdin = io::stdin();
let mut reader = Box::new(stdin.lock()) as Box<BufRead>;   

//...

reader = Box::new(BufReader::new(file.unwrap()));  
让stdin=io::stdin();
让mut reader=Box::new(stdin.lock())作为Box;
//...
reader=Box::new(BufReader::new(file.unwrap());
这将起作用

use std::io;
use std::io::BufReader;
use std::io::prelude::*;
use std::env;
use std::process::exit;
use std::fs::File;

fn usage() {
    println!("Usage: cat input.csv | csv_to_json");
}

fn main() {
    let stdin = io::stdin();
    let mut reader = Box::new(stdin.lock()) as Box<BufRead>;
    let args: Vec<String> = env::args().collect();

    if args.len() > 1 {
        usage();
        exit(1);
    } else if args.len() == 1 {
        let file = File::open(args[0].clone());
        if !file.is_ok() {
            usage();
            exit(1);
        }
        reader = Box::new(BufReader::new(file.unwrap()));
    }
}
使用std::io;
使用std::io::BufReader;
使用std::io::prelude::*;
使用std::env;
使用std::process::exit;
使用std::fs::File;
fn用法(){
println!(“用法:cat input.csv | csv_to_json”);
}
fn main(){
设stdin=io::stdin();
让mut reader=Box::new(stdin.lock())作为Box;
让args:Vec=env::args().collect();
如果args.len()大于1{
用法();
出口(1);
}如果args.len()==1,则为else{
让file=file::open(args[0].clone());
if!file.is_ok(){
用法();
出口(1);
}
reader=Box::new(BufReader::new(file.unwrap());
}
}

An
&BufRead
不会有太大帮助,因为所有有趣的
BufRead
方法都采用
&mut self
。我想指出的是,没有必要在条件之前声明任何变量,因为它们没有在条件中使用。因此,最好重写代码以避免使用trait对象,因为它们在这里确实是不必要的。感谢您在这种情况下正确使用Box。非常有用。下面是答案的摘要:使用“Box”类型。一个框是一个软多态引用(类似于C/C++风格语言中的指针)。
let stdin = io::stdin();
let mut reader = Box::new(stdin.lock()) as Box<BufRead>;   

//...

reader = Box::new(BufReader::new(file.unwrap()));  
use std::io;
use std::io::BufReader;
use std::io::prelude::*;
use std::env;
use std::process::exit;
use std::fs::File;

fn usage() {
    println!("Usage: cat input.csv | csv_to_json");
}

fn main() {
    let stdin = io::stdin();
    let mut reader = Box::new(stdin.lock()) as Box<BufRead>;
    let args: Vec<String> = env::args().collect();

    if args.len() > 1 {
        usage();
        exit(1);
    } else if args.len() == 1 {
        let file = File::open(args[0].clone());
        if !file.is_ok() {
            usage();
            exit(1);
        }
        reader = Box::new(BufReader::new(file.unwrap()));
    }
}