while과 에러 유니온

while과 에러 유니온 (while with Error Unions)

if 표현식과 마찬가지로, while 루프도 조건으로 에러 유니온을 받아서 페이로드나 에러 코드를 잡아낼 수 있어요. 조건이 에러 코드로 판정되면 else 분기가 평가되고, 그 시점에 루프는 끝나게 됩니다.

while 표현식에 else |x| 구문이 쓰이면, 그 while 조건은 반드시 에러 유니온 타입(Error Union Type)이어야 해요.

출처: Zig Documentation

본문

while 루프가 에러 유니온을 조건으로 받아 페이로드(|value|)나 에러 코드(err)를 잡아내는 예시를 볼게요. eventuallyErrorSequenceanyerror!u32를 반환하다가 numbers_left가 0이 되면 error.ReachedZero를 돌려주는 함수예요.

const expectEqual = @import("std").testing.expectEqual;

test "while error union capture" {
    var sum1: u32 = 0;
    numbers_left = 3;
    while (eventuallyErrorSequence()) |value| {
        sum1 += value;
    } else |err| {
        try expectEqual(error.ReachedZero, err);
    }
}

var numbers_left: u32 = undefined;

fn eventuallyErrorSequence() anyerror!u32 {
    return if (numbers_left == 0) error.ReachedZero else blk: {
        numbers_left -= 1;
        break :blk numbers_left;
    };
}

이 코드를 실행하면 페이로드가 정상적으로 누적되다가, 마지막에는 error.ReachedZeroelse |err| 분기에서 잡혀서 expectEqual로 확인돼요.

$ zig test test_while_error_capture.zig
1/1 test_while_error_capture.test.while error union capture...OK
All 1 tests passed.

더 알아보기 (Learn more)