NEPLg2 Standard Library - option - option
Web Playground
Web Playground

option

あたい有無うむあらわ基本型きほんがたと helper

目的もくてき

  • 存在そんざいするあたい (Some) と不在ふざい (None) を明示的めいじてきあつかOption基本操作きほんそうさ提供ていきょうします。
  • reboot の stdlib で「単純たんじゅん欠如けつじょOption失敗理由しっぱいりゆうつきは Result」という責務分離せきむぶんりささえる最小基盤さいしょうきばんです。

注意ちゅうい

  • unwrap便宜上べんぎじょうのこしている unsafe helper であり、通常つうじょうmatchoption_unwrap_or優先ゆうせんしてください。
  • doctest では trap 依存いぞんshould_panic使つかわず、安全あんぜん分岐ぶんきret: 比較ひかく確認かくにんします。

計算量けいさんりょう

  • 基本操作きほんそうさはすべて O(1) です。
TEST
#entry main
#target std
#import "std/test" as *
#import "core/option" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert is_some some 123
        |> checks_push assert is_none none<i32>
        |> checks_push assert_eq_i32 123 unwrap some 123
        |> checks_push assert_eq_i32 7 option_unwrap_or none<i32> 7
    checks_exit_code checks
TEST
#entry main
#target std
#import "std/test" as *
#import "core/option" as *
#import "core/math" as *
fn inc <(i32)->i32> (x):
    add x 1

fn main <()*>i32> ():
    let a0 option_map some 9 inc;
    let a1 option_map some 9 inc;
    let b option_map none<i32> inc;
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert is_some a0
        |> checks_push assert is_none b
        |> checks_push assert_eq_i32 10 unwrap a1
    checks_exit_code checks

Option: 値がある(Some)か無い(None)かを表す

目的:

  • 失敗・欠損を明示するための共通型です。

実装(アルゴリズム):

  • enum の 2 変種で表現します。

注意(重要):

  • Some は payload を保持します。

計算量:

  • O(1)

none: None を作る

目的:

  • 値が無いことを表す Option を返します。

実装(アルゴリズム):

  • Option::None を返すだけです。

注意(重要):

  • 型引数 .T は文脈で決まります。

計算量:

  • O(1)

some: 値を包んで返す

目的:

  • v を Some に包んで返します。

実装(アルゴリズム):

  • Option::Some を構築します。

注意(重要):

  • v の型が .T になります。

計算量:

  • O(1)

is_some: 値があるか判定する

目的:

  • Some なら true、None なら false を返します。

実装(アルゴリズム):

  • match で Some/None を分岐します。

注意(重要):

  • 値そのものは取り出しません。

計算量:

  • O(1)

is_none: 値が無いか判定する

目的:

  • None なら true、Some なら false を返します。

実装(アルゴリズム):

  • match で Some/None を分岐します。

注意(重要):

  • is_some の否定です。

計算量:

  • O(1)

unwrap: Some の中身を取り出す(None は到達不能)

目的:

  • Some(v) なら v を返します。

実装(アルゴリズム):

  • match で分岐し、None は unreachable を呼びます。

注意(重要):

  • None の可能性がある場合は is_some や option_unwrap_or を使ってください。

計算量:

  • O(1)

option_unwrap_or: デフォルト値を返す

目的:

  • Some(v) なら v、None なら default を返します。

実装(アルゴリズム):

  • match で分岐します。

注意(重要):

  • default は eager に評価されます。

計算量:

  • O(1)

option_map: 値がある時だけ関数を適用する

目的:

  • Some(v) なら f(v) を Some として返し、None はそのまま返します。

実装(アルゴリズム):

  • match で Some/None を分岐し、Some のときのみ f を適用します。

注意(重要):

  • f は純粋関数を想定します。

計算量:

  • O(1)