result
成功/せいこう と 失敗/しっぱい を
目的
処理 の成功 /失敗 を値 として明示的 に扱 うためのResultと基本操作 を提供 します。- reboot
後 の stdlib で「安全 API はResult/Outcomeを返 す」という方針 を支 える最小基盤 です。
注意
unwrap_ok/unwrap_errは便宜上 残 している unsafe helper であり、通常 はmatchやunwrap_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 checksTESTcompile_fail
#entry main
#target std
#import "core/result" as *
// 型が合わない Err を入れているのでコンパイルエラーを期待
fn main <()*>()> ():
let r <i32> "text";
rTEST
#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 checksResult: 成功(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)