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