Vec の基本

Vec .T は所有権を持つ growable collection です。作成や追加は失敗しうるため、Resultmatch して扱います。値引数のない new は typed local で Result Vec i32 StdErrorKind を明示し、要素型を呼び出し側の文脈から決めます。

TESTstdionormalize_newlines
#entry main
#indent 4
#target std

#import "alloc/collections/vec" as *
#import "core/option" as *
#import "core/result" as *
#import "std/test" as *
#import "core/field" as *

fn build_numbers %impure fn void Result Vec i32 str \void:
    let created %Result Vec i32 StdErrorKind new
    match created:
        Result::Err _e:
            Result::Err "vec.new failed"
        Result::Ok v0:
            match push v0 10:
                Result::Err e:
                    free vec_push_error_vec e;
                    Result::Err "vec.push 10 failed"
                Result::Ok v1:
                    match push v1 20:
                        Result::Err e:
                            free vec_push_error_vec e;
                            Result::Err "vec.push 20 failed"
                        Result::Ok v2:
                            Result::Ok v2

fn expect_item %fn &Vec i32 fn i32 fn i32 Result unit str \v\idx\expected:
    match get v idx:
        Option::Some value:
            check_eq_i32 expected value
        Option::None:
            Result::Err "missing vec item"

fn main %impure fn void i32 \void:
    match build_numbers:
        Result::Err msg:
            let checks checks_push checks_new Result::Err msg
            let shown checks_print_report checks
            checks_exit_code shown
        Result::Ok numbers:
            let n %i32 len &numbers
            let item0 %Result unit str expect_item &numbers 0 10
            let item1 %Result unit str expect_item &numbers 1 20
            let checks:
                checks_new
                |> checks_push assert_eq_i32 2 n
                |> checks_push item0
                |> checks_push item1
            free numbers;
            let shown checks_print_report checks
            checks_exit_code shown

Vec の owner は最後に free します。読み取りだけなら &numbers を渡し、collection 本体を消費しないようにします。

On this page