文字列から数値へのパース
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 47/66。
Result の最も一般的な実用的なアプリケーションの1つは、文字列を数値に変換することです。Rustでは、これは .parse() メソッドを使用して行われます。これは、パース(解析)が失敗する可能性があるため、なぜ Result が存在するのかを完璧に示しています。
.parse()メソッドは文字列を数値に変換しようとしますが、すべての文字列が有効な数値を表しているわけではありません。例えば、"42"は数値の42にパースできますが、"hello"はいかなる数値にも変換できません:
let valid_number = "42";
let invalid_number = "hello";
let result1: Result = valid_number.parse();
let result2: Result = invalid_number.parse();パースに成功すると、.parse() は変換された値を含む Ok(number) を返します。失敗した場合は、パースが失敗した理由に関する情報を含む Err(error) を返します。これにより、両方の可能性を明示的に処理することが強制され、無効な入力によってプログラムがクラッシュするのを防ぐことができます。
これまでに学んだResultの手法のいずれかを使用して、パース結果を処理できます。明示的な処理のためのmatch、成功が確実な場合のunwrap()、またはエラーを伝播させるための?演算子などです。
チャレンジ
簡単文字列 input を受け取り、解析された整数値を返す関数 parse_to_integer を作成してください。文字列を有効な整数に解析できない場合は、デフォルト値として 0 を返してください。
.parse() メソッドを使用して文字列を i32 に変換し、Result を適切に処理して安全な戻り値を提供してください。
引数:
input(String): 整数に解析する文字列
戻り値: 成功した場合は解析された整数、解析に失敗した場合は 0 (i32)
チートシート
.parse()メソッドは文字列を数値に変換し、パースが失敗する可能性があるためResult型を返します:
let valid_number = "42";
let invalid_number = "hello";
let result1: Result<i32, _> = valid_number.parse();
let result2: Result<i32, _> = invalid_number.parse();パースに成功すると、.parse()はOk(number)を返します。失敗すると、Err(error)を返します。
パース結果の処理には、match、unwrap()、?演算子、または失敗時にデフォルト値を提供するためのunwrap_or()を使用できます。
自分で試してみよう
fn parse_to_integer(input: String) -> i32 {
// ここにコードを記述してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
7'Result' によるエラーハンドリング
'Result' とは?'Result' で 'match' を使うis_ok() と is_err()ショートカット: unwrap と expectクエスチョンマーク演算子 '?'文字列から数値へのパースまとめ - 安全な除算関数