Optionに該当する者は比較的新しいC++でも実装されている。std::optionalとstd::nulloptがそれにあたる。ともあれ、Optionは、戻り値にその関数が本来返す値の他に、値が存在しないことを示すNoneを返すことができるようにする仕組みである。
値が存在しないというのは、例えば「i32の配列の中に条件を満たす値があったら返す」のような処理で、該当する数値がなかった場合は、答えがないことになる。
以下は、値がないことも表せる値をValueOrNotFoundというenumで自前実装した例。
// Optionのまねごとをするために自前実装した、 // 「値がないことを表せる ValueOrNotFound型」 enum ValueOrNotFound{ Value(i32), // i32型のValue NotFound, // 定数 NotFound。結果が見つからなかったときはこれが有効 }
// src中の、最初に見つかったthres以下の値を返す関数 // 戻り値はValueOrNotFound型で返す。これは整数値かNotFound定数のどちらかを入れられる fn Search(src:[i32;5],thres:i32)->ValueOrNotFound{ for &val in src.iter(){ if val <= thres{ return ValueOrNotFound::Value(val); // 見つかった場合、整数値を返す } } return ValueOrNotFound::NotFound; // 見つからない場合、NotFound定数を返す }
fn main() { // 配列を定義 let array = [5,6,7,8,9]; // ある値以下の値を一つ返す let ret = Search(array,3); // 値が入っていたら、vを定義しそれを代入 if let ValueOrNotFound::Value(v) = ret { println!("found {}",v); } else{ println!("not found"); } }
// src中の、最初に見つかったthres以下の値を返す関数 // 戻り値はOption型で返す。これはジェネリックで指定するi32型を取る /* Optionの定義は以下のようになっている。 <T>とジェネリックで型を指定するようになっているのであらゆる型を持てる。 pub enum Option<T> { /// No value. None, /// Some value of type `T`. Some(T), } */ fn Search(src:[i32;5],thres:i32)->Option<i32>{ for &val in src.iter(){ if val <= thres{ return Option::Some(val); // 見つかった場合、整数値を返す } } return Option::None; // 見つからない場合、Noneを返す } fn main() { // 配列を定義 let array = [5,6,7,8,9]; // ある値以下の値を一つ返す let ret = Search(array,3); // 値が入っていたら、vを定義しそれを代入 if let Option::Some(v) = ret { println!("found {}",v); } else{ println!("not found"); } }