RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

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)