io::stdio
インスタンスを入力し、BufReader
というファイルをラップしてバッファリングされた入力ソースを想定してコードを書き込もうとしています。私が試してみましたio :: stdioとBufReaderの間のBufRead特性の互換性を強制する
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 = stdin.lock(); // Assignment. (1)
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 = BufReader::new(file.unwrap()); // Reassignment. This is the line that fails.
}
// Rest of the code works with reader assuming a buffered input source.
}
もの:ここでは、コードだ
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());
:私はBufRead
型にio::stdio()
をキャストしようとしているのいくつかのバリエーションを試したし、すべてがの一の以上のバリエーションで失敗してきました:私も、独自の機能と戻り値の型シグネチャにそのコードを抽出しようとした
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.
同様のエラー条件で失敗します。どのようにしてBufferedReader
をstdio
に、またはBufferedReader
をFile
にして、どこのタイプのエラーも発生させない「リーダー」変数を作成できますか?
以下の回答の要約:「ボックス」タイプを使用してください。 Boxはソフト多形参照です(C/C++スタイルの言語のポインタに似ています)。 –