Rustで100本ノック: 標準入力からの文字入力と数値変換
ということで100本ノックやってますが、その中でキーボード入力というのが発生してきます。初心者的なコードではお約束ですね… ここではそのときに遭遇したことのおさらいリプレイです。
これが最良かはともかく、基本的な処理として、std::io を使います(というかググって確認してました)。クラス的なモノ?
fn main() {
println!("何か入力を");
let mut data = String::new();
std::io::stdin().read_line(&mut data);
println!("{}", data);
}
とはいえこれではエラーになりました、read_line()のところがイケないようです。
Rustを使ってるとよくあるという「結果の確認をしないといけませんよ」という話のようですね。そういうものはResult<>型に渡される仕組みのようで、何らかの方法で確認(したことに)しないといけないようです。
いろいろありそうなのですが、目に付いたのは、ok()やexpect()でしょうか。
ok(): Option<>に変換できる、これは別に評価(確認)を強制されない
expect("msg"): 成功するはずであると期待しており、失敗したときには引数(文字列)を出力して終了
ok()いいんじゃね? ということでこんなことに
fn main() {
println!("何か入力を");
let mut data = String::new();
std::io::stdin().read_line(&mut data).ok();
println!("{}", data);
}
これで動きました。入力中の終了を検出して止めるという意味では、expect()を使った方が良いのかもしれませんね。
fn main() {
println!("何か入力を");
let mut data = String::new();
std::io::stdin().read_line(&mut data).expect("入力中に異常がありました");
println!("{}", data);
}
あれ? 途中で強制的にstdinをクローズしてもエラー判定されないのね。どういうときに反応するんだろうか?
まぁいいや。単純に文字列を得るのであれば、これでなんとかなるわけで、No.03はこんな感じで対応できる、と。
std::ioというこの表現って、useを使ってシンボルioを見つけられるようにできるかな、ということで、
use std::io;
・・・
io::stdin().read_line(&mut data).ok();
は予想通りうまくいくということがわかりました。とりあえず文字列を受け取ることに関してはこれでok()ということかな。
この記事が気に入ったらサポートをしてみませんか?