Skip to content

std.result ​

Result(T, E) の構築と分解、および Error キャリアのフィールドアクセス。

yaoxiang
use std.result

ランタイム表現 ​

値表現
Result.ok(value)列挙型バリアント、value を保持
Result.err(error)列挙型バリアント、error を保持
Error構造体、フィールドは (code, message)

Error.code は RFC-013 の E6xxx / E7xxx セグメント登録コード(バージョン間安定契約)、Error.message は人間が読める説明です。

関数一覧 ​

関数シグネチャ
is_ok(T: Type, E: Type)(self: &Result(T, E)) -> Bool
is_err(T: Type, E: Type)(self: &Result(T, E)) -> Bool
unwrap(T: Type, E: Type)(self: &Result(T, E)) -> T
unwrap_or(T: Type, E: Type)(self: &Result(T, E), default: T) -> T
ok(T: Type, E: Type)(value: T) -> Result(T, E)
err(T: Type, E: Type)(error: E) -> Result(T, E)
unwrap_err(T: Type, E: Type)(self: &Result(T, E)) -> E
code(self: &Error) -> String
message(self: &Error) -> String

構築 ​

ok ​

yaoxiang
ok: (T: Type, E: Type)(value: T) -> Result(T, E)

成功値を包みます。

? で分解された Ok 値は Result の戻り型に沿って伝播を続けるために再包装が必要であり、ok がそのラッパーです。

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.ok(42)
    assert(result.is_ok(r))
}

err ​

yaoxiang
err: (T: Type, E: Type)(error: E) -> Result(T, E)

エラー値を包みます。

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.err("boom")
    assert(result.is_err(r))
}

判定 ​

is_ok ​

yaoxiang
is_ok: (T: Type, E: Type)(self: &Result(T, E)) -> Bool

成功バリアントかどうかを判定します。読み取り専用借用で、self は繰り返し使用可能です。

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.ok(1)
    assert(result.is_ok(r))
    assert(result.is_ok(r))      // 再利用可能
}

is_err ​

yaoxiang
is_err: (T: Type, E: Type)(self: &Result(T, E)) -> Bool

エラーバリアントかどうかを判定します。読み取り専用借用。

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.err("e")
    assert(result.is_err(r))
}

値の取り出し ​

unwrap ​

yaoxiang
unwrap: (T: Type, E: Type)(self: &Result(T, E)) -> T

成功値を取り出します。

戻り値:Ok バリアントが保持する値。エラー:Err 値に対して呼び出した場合 E6007 を送出し、メッセージには元々のエラーコードと説明が付属し、例えば unwrap called on Err value (E6010: parse_int: ...) のようになります。そのため unwrap_err を先に呼ばなくても失敗原因を確認できます。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("42")
    assert(result.unwrap(r) == 42)
}

unwrap_or ​

yaoxiang
unwrap_or: (T: Type, E: Type)(self: &Result(T, E), default: T) -> T

成功値を取り出すか、Err の場合は default を返します。

  • default —— Err 時の既定値
yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    good = string.parse_int("42")
    assert(result.unwrap_or(good, 0) == 42)

    bad = string.parse_int("abc")
    assert(result.unwrap_or(bad, 0) == 0)
}

unwrap_err ​

yaoxiang
unwrap_err: (T: Type, E: Type)(self: &Result(T, E)) -> E

エラー値を取り出します。

戻り値:Err バリアントが保持する値。エラー:Ok 値に対して呼び出した場合 E6007 を送出します。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(result.is_err(r))
}

Error フィールド ​

code ​

yaoxiang
code: (self: &Error) -> String

エラーコード文字列を "E6010" のような形式で読み取ります。

シグネチャの型は Error ですが、ランタイムエラーキャリアは (code, message) をフィールドとする構造体です。Error 値に対して直接呼び出します。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(result.code(e) == "E6010")
}

message ​

yaoxiang
message: (self: &Error) -> String

エラー説明テキストを読み取ります。

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(string.len(result.message(e)) > 0)
}

関連 ​