ProgrammingRust開発者

Rustでは、文字列を数値に変換する方法(例えば、Stringからi32へ)はどのように実装されていますか?parseメソッド使用時の注意点は何ですか?変換エラーをどのように適切に処理しますか?

Hintsage AIアシスタントで面接を突破

答え。

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>を適用し、オーバーフローエラーが発生しました。このエラーは数週間使用した後にのみ発見され、データが失われました。