Rust 入力した文字列を数値に変換する parse, match
概要
- 文字列を数値に変換するには parse を使う。
- 単純な実装だと、変換失敗時にプログラムが落ちる。
- 変換失敗時の処理を書くには match を使う。
コード
- 文字列の入力を要求し、99 を掛け算する。
use std::io::*; fn main() { let 入力 = コンソール入力(); let 数値: i32 = 入力.parse().unwrap(); println!("{} × 99 = {}", 数値, 数値 * 99); } fn コンソール入力() -> String { let mut バッファ = String::new(); stdin().read_line(&mut バッファ).unwrap(); バッファ.trim().to_string() }
- 7ケタ程度の整数を入力した場合は成功する。
- ケタの大きすぎる整数や、数値以外の入力をするとプログラムが落ちてしまう。
改善
- 数値以外の入力をされたら「無効な値」と表示して終了する。
use std::io::*; fn main() { let 入力 = コンソール入力(); let 数値 = match 入力.parse::<i32>() { Ok(n) => n, // 成功時 Err(_) => { // 失敗時 println!("{}", "無効な値"); return } }; println!("{} × 99 = {}", 数値, 数値 * 99); } fn コンソール入力() -> String { let mut バッファ = String::new(); stdin().read_line(&mut バッファ).unwrap(); バッファ.trim().to_string() }
解説
- 各行の意味は以下の通り。
fn main() { let 入力 = コンソール入力(); // └ 変数「入力」にはコンソール入力した文字列が入る。 let 数値 = match 入力.parse::<i32>() { // └ 入力.parse::<i32>():変数「入力」を i32(整数)に変換する。 // └ match:変換の結果によって処理が分岐する。 Ok(n) => n, // └ 変換に成功したら、値を取り出して「数値」に入れる。 Err(_) => { // └ 変換に失敗した場合の処理が続く。 println!("{}", "無効な値"); return // └ return:関数「main」から脱出する。以下は処理されない。 } }; println!("{} × 99 = {}", 数値, 数値 * 99); }
- 文字列.parse::<i32>()で、文字列を整数に変換する。
- i32 は、二進法の32ケタで表せる整数を表す。-2,147,483,648 ~ +2,147,483,647
- 桁数の異なるいくつかの変数の種類がある。
- i8(二進法 8 ケタ:-128 ~ +127)
- i16(二進法 16 ケタ:-32,768 ~ 32,767)
- i64(二進法 64 ケタ:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)