Rust標準入出力コード分析
Rustの長くて奇妙な標準入力コードを見て驚き、知っている範囲でまとめた記事
AI生成コンテンツは不正確または誤解を招く可能性があります。
use std::io;
fn main() {
let mut b = String::new();
io::stdin().read_line(&mut b).expect("Failed to read line");
let b: Vec<f64> = b
.split_whitespace()
.map(|x| x.trim().parse().expect("Please type a number!"))
.collect::<Vec<_>>();
println!("{}", b[0] / b[1]);
}上記のコードはAtCoder等の競技プログラミングサイトのa - b問題をRustで解いた結果です。
かなり複雑に見えますが、ちょっとC言語で解いたバージョンを見てみましょう。
#include <stdio.h>
int main(void) {
float a, b;
scanf("%f %f", &a, &b);
printf("%f\n",a/b);
}Rustと比較すると本当にシンプルです。
では、なぜRustの場合はこんなに多くのコードを書く必要があるのでしょうか?
それはエラーを防ぐためです。
もしユーザーがe 2と入力した場合を考えてみましょう。
Rustの場合はexpect()によってエラーを発生させて終了しますが、
Cの場合は0.673556のような変な値が出力されます。
そうです...まだ何が良いのかは分かりませんが、Rust側が不便な(慣れていない)のは事実です。
Rust文法説明
let mut b = String::new(); 可変なString型の変数bを作成
io::stdin().read_line(&mut b).expect("Failed to read line"); 1行を入力として受け取り、bのアドレスに保存する
let b: Vec<f64> = b.split_whitespace() まだよく分からない、後でRustをもっと勉強したら修正しよう(おそらく空白を基準に分割してVec(大体配列のようなもの)形式で保存)
.map(|x| x.trim().parse().expect("Plese type a number!")) mapを使ってVec型のbの要素一つ一つをtrim()で空白を除去し(これやらなくてもいいんじゃない?)、parse()を使って数値型に変換するコードだと思うです
.collect::<Vec<_>>(); 分からないーーーー
まだRust初心者なので、たくさん勉強が必要そうです。 いつかRustをPythonのように使いこなせる日が来るでしょうか?