Rustで文字列を数値に変換する標準メソッドはparse()です。これは、FromStrトレイトを実装している型に適用でき、例えばStringや&strをi32、f64などに変換するために使用されます。
例:
let num: i32 = "42".parse().unwrap();
ただし、不正な文字列の場合、エラー(Result::Err)が発生します。アプリケーションのクラッシュを避けるために、結果をmatchで処理することが重要です。
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("数値: {}", n), Err(e) => println!("パースエラー: {}", e), }
parseメソッドは、型を暗黙的に推論できない場合に"turbofish"(::<i32>)を通じて型のオーバーロードをサポートしています。
質問: コンパイル時に型を指定せずに.parse()を呼び出して正しい結果を得ることはできますか?
よくある回答: はい、文字列が数値を含む場合。
正しい回答: いいえ、コンパイル時に変換先の型が知られている必要があります。型が明示的に使われない場合、コンパイラはエラーを出します。
間違ったコードの例:
let x = "10".parse(); // エラー: どの型にパースするか不明
修正するにはturbofishを使用します:
let x = "10".parse::<i32>().unwrap();
逸話
設定のパースモジュールで.parse().unwrap()をエラーハンドリングなしに残しました。ユーザー設定のタイプミスが原因でpanic!が発生し、本番環境でアプリケーションが停止しました。
逸話
あるプロジェクトで、開発者が型を明示的に指定せず(turbofishを使わず)、中間変数が使用されなかったため、コンパイラが型を推論できずコンパイル時に見えにくいエラーが発生しました。
逸話
プロジェクトで文字列から大きな数をパースする際に誤ってparse::<u8>を適用し、オーバーフローエラーが発生しました。このエラーは数週間使用した後にのみ発見され、データが失われました。