Rust では、FromStr トレイトを使用して、文字列から数値への変換のための便利な標準手段を提供しています。最も一般的に使用されるのは .parse::<T>() メソッドで、これは文字列やスライスで呼び出すことができます。
多くの言語において、文字列を数値に変換することは一般的なタスクですが、Rust では最大限に安全かつ透明に行われ、エラー処理は標準ライブラリの約束の一部であり、ランタイム例外ではありません。
.parse::<T>() は Result<T, ParseIntError> 型の結果を返します(他の型の場合も同様)、そのため失敗を明示的に処理する必要があります。よくある誤りは、エラーの可能性を無視し、調査なしに unwrap() を使用することで、データの不正入力時にプログラムがクラッシュするリスクがあり、適切なエラーメッセージが表示されません。
文字列を変換するために parse メソッドが使用されます。そのシグネチャは次のとおりです:
let num: i32 = "42".parse().unwrap();
しかし、エラーを適切に処理するのがより良い方法です:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("取得した数値: {}", n), Err(e) => println!("解析エラー: {e}"), }
主な特徴:
FromStr が実装されていますが、正確な制約は不明瞭です:空白、符号、オーバーフローは異なる方法で考慮されます。Result として返され、パニックや例外を通じてではありません。.parse() のターゲットになり得る FromStr を実装している(ユーザー定義型を含む)結果の型を指定せずに parse を使用できますか?
いいえ、型を明示しない(または型の暗黙の推論がない)場合、Rust はどの型に変換すべきか理解できないためエラーが発生します。
数字以外の内容の文字列を数値に変換しようとしたらどうなりますか?
メソッドはエラーを返します(Err(...))、パニックは発生しません。エラーは Debug トレイトを実装しているので、出力に便利です。
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
内容が確実であれば parse の後に unwrap を使用できますか?
技術的には可能ですが、これはアンチパターンです。文字列が予期しない無効な場合、プログラムは異常終了します。
unwrap() を使用することtrim を使用しないことparse::<String>())コンソールユーティリティがユーザーから数値を読み取り、.parse().unwrap() を使用します。偶然に無効な入力があった場合、プログラムは突然クラッシュし、ユーザーはその理由を理解できません。
長所:
短所:
入力が最初に空白を取り除かれ、parse が match シナリオで使用されるか、必要に応じて map_err が自分のエラーを返すために使用されます。エラーが適切に処理され、明確なエラーメッセージが表示されます。
長所:
短所: