見出し画像

Rustで100本ノック: 標準入力からの文字入力と数値変換

ということで100本ノックやってますが、その中でキーボード入力というのが発生してきます。初心者的なコードではお約束ですね… ここではそのときに遭遇したことのおさらいリプレイです。

これが最良かはともかく、基本的な処理として、std::io を使います(というかググって確認してました)。クラス的なモノ?​

fn main() {
   println!("何か入力を");
   let mut data = String::new();
   std::io::stdin().read_line(&mut data);
   println!("{}", data);
}

とはいえこれではエラーになりました、read_line()のところがイケないようです。

画像1

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をクローズしてもエラー判定されないのね。どういうときに反応するんだろうか?

画像2

まぁいいや。単純に文字列を得るのであれば、これでなんとかなるわけで、No.03はこんな感じで対応できる、と。

std::ioというこの表現って、useを使ってシンボルioを見つけられるようにできるかな、ということで、

use std::io;
・・・
   io::stdin().read_line(&mut data).ok();

は予想通りうまくいくということがわかりました。とりあえず文字列を受け取ることに関してはこれでok()ということかな。

この記事が気に入ったらサポートをしてみませんか?