@TypeOf

@TypeOf

출처: Zig Documentation

본문

표현식의 타입이 궁금할 때, Zig에서는 @TypeOf라는 특별한 내장 함수를 써요. 어떤 (0이 아닌) 개수의 표현식을 인자로 받아서, 그 결과의 타입을 돌려줘요. 이때 타입을 정하는 기준은 Peer Type Resolution이에요.

인자로 넘긴 표현식은 실제로 평가되긴 해요. 다만 런타임 부작용(runtime side-effects)이 없다는 점은 보장돼요. 즉, 값이 바뀌거나 하는 일 없이 타입만 알아내는 데 쓰인다는 뜻이에요. 바로 아래 테스트로 그걸 확인해 볼게요.

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

test "no runtime side effects" {
    var data: i32 = 0;
    const T = @TypeOf(foo(i32, &data));
    try comptime expectEqual(i32, T);
    try expectEqual(0, data);
}

fn foo(comptime T: type, ptr: *T) T {
    ptr.* += 1;
    return ptr.*;
}
$ zig test test_TypeOf_builtin.zig
1/1 test_TypeOf_builtin.test.no runtime side effects...OK
All 1 tests passed.

여기서 코드가 data1을 더하도록 되어 있음에도, @TypeOf(foo(i32, &data))를 평가한 뒤에도 data는 여전히 0으로 남아 있어요. @TypeOf가 넘겨받은 표현식을 평가하긴 하지만 부작용은 일으키지 않는다는 점, 이 테스트가 바로 그 동작을 지키고 있는 거예요. 그 결과로 Ti32 타입이라는 걸 컴파일 타임에 확인한답니다.

더 알아보기