NEPLg2 Standard Library - result - result
Web Playground
Web Playground

result

成功/せいこう失敗/しっぱいあらわ基本型きほんがたと helper

目的もくてき

  • 処理しょり成功せいこう / 失敗しっぱいあたいとして明示的めいじてきあつかうための Result基本操作きほんそうさ提供ていきょうします。
  • reboot の stdlib で「安全あんぜん API は Result / Outcomeかえす」という方針ほうしんささえる最小基盤さいしょうきばんです。

注意ちゅうい

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

計算量けいさんりょう

  • 基本操作きほんそうさはすべて O(1) です。
TEST
#entry main
#target std
#import "std/test" as *
#import "core/result" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert is_ok ok<i32, str> 1
        |> checks_push assert is_err err<i32, str> "oops"
        |> checks_push assert_eq_i32 1 unwrap_ok ok<i32, str> 1
        |> checks_push assert_str_eq "oops" unwrap_err err<i32, str> "oops"
        |> checks_push assert_eq_i32 9 unwrap_or err<i32, str> "x" 9
    checks_exit_code checks
TESTcompile_fail
#entry main
#target std
#import "core/result" as *
// 型が合わない Err を入れているのでコンパイルエラーを期待
fn main <()*>()> ():
    let r <i32> "text";
    r
TEST
#entry main
#target std
#import "std/test" as *
#import "core/result" as *
#import "core/math" as *
fn inc <(i32)->i32> (x):
    add x 1

fn strlen <(str)->i32> (s):
    4

fn main <()*>i32> ():
    let a map ok<i32,str> 9 inc;
    let b map_err err<i32,str> "oops" strlen;
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert_eq_i32 10 unwrap_ok a
        |> checks_push assert_eq_i32 4 unwrap_err b
    checks_exit_code checks

Result: 成功(Ok)か失敗(Err)を表す

目的:

  • 成功値 .T と失敗値 .E を区別して保持します。

実装(アルゴリズム):

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

注意(重要):

  • Ok/Err は payload を保持します。

計算量:

  • O(1)

ok: 成功値を包む

目的:

  • v を Ok として返します。

実装(アルゴリズム):

  • Result::Ok を構築します。

注意(重要):

  • .E は文脈で決まります。

計算量:

  • O(1)

err: 失敗値を包む

目的:

  • e を Err として返します。

実装(アルゴリズム):

  • Result::Err を構築します。

注意(重要):

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

計算量:

  • O(1)

is_ok: 成功か判定する

目的:

  • Ok なら true、Err なら false を返します。

実装(アルゴリズム):

  • match で Ok/Err を分岐します。

注意(重要):

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

計算量:

  • O(1)

is_err: 失敗か判定する

目的:

  • Err なら true、Ok なら false を返します。

実装(アルゴリズム):

  • match で Ok/Err を分岐します。

注意(重要):

  • is_ok の否定です。

計算量:

  • O(1)

unwrap_ok: Ok の中身を取り出す(Err は到達不能)

目的:

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

実装(アルゴリズム):

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

注意(重要):

  • Err の可能性がある場合は is_ok や unwrap_or を使ってください。

計算量:

  • O(1)

uwok

unwrap_ok短縮名たんしゅくめい

目的もくてき

  • pipe 記法きほうResult連続れんぞくして処理しょりするときに、unwrap_ok よりみじかけるようにします。

使用例しようれい

TEST
#entry main
#target std
#import "std/test" as *
#import "core/result" as *
fn main <()*>i32> ():
    assert_eq_i32 1 uwok ok<i32, str> 1;
    0

実装じっそう

  • unwrap_ok への別名べつめいです。

注意ちゅうい

  • 左側ひだりがわResult<T, E> から T推論すいろんできる場面ばめんでは、ふつうは型注釈かたちゅうしゃく不要ふようです。

計算量けいさんりょう

  • unwrap_okおなじです。

unwrap_err: Err の中身を取り出す(Ok は到達不能)

目的:

  • Err(e) なら e を返します。

実装(アルゴリズム):

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

注意(重要):

  • Ok の可能性がある場合は is_err や map_err を使ってください。

計算量:

  • O(1)

uwerr

unwrap_err短縮名たんしゅくめい

目的もくてき

  • Result::Err中身なかみを pipe 記法きほうでもみじかせるようにします。

実装じっそう

  • unwrap_err への別名べつめいです。

注意ちゅうい

  • Result::Okわたすと unwrap_errおなじく到達不能とうたつふのうになります。

計算量けいさんりょう

  • unwrap_errおなじです。

unwrap_or: 失敗時のデフォルトを返す

目的:

  • Ok(v) なら v、Err なら default を返します。

実装(アルゴリズム):

  • match で分岐します。

注意(重要):

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

計算量:

  • O(1)

map: Ok の値に関数を適用する

目的:

  • Ok(v) なら f(v) を Ok で返し、Err はそのまま返します。

実装(アルゴリズム):

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

注意(重要):

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

計算量:

  • O(1)

map_err: Err の値に関数を適用する

目的:

  • Err(e) なら f(e) を Err で返し、Ok はそのまま返します。

実装(アルゴリズム):

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

注意(重要):

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

計算量:

  • O(1)