@splat — 배열·벡터의 모든 요소를 같은 값으로 채우기
@splat — 배열·벡터의 모든 요소를 같은 값으로 채우기
벡터의 각 요소를 전부 같은 값으로 채워야 할 때가 있어요. 예컨대 "이 벡터를 전부 5로 채워서 만들고 싶다" 같은 상황이죠. 요소를 하나하나 나열하는 대신, 한 값만 주면 그걸 반복해서 배열이나 벡터로 만들어 주는 내장 함수가 @splat이에요.
본문
시그니처는 이렇게 생겼어요.
@splat(element: anytype) anytype
@splat은 각 요소가 전달한 값 element를 가지는 배열 또는 벡터를 만들어 줘요. 반환 타입은 요소 개수를 포함해서 모두 추론(inferred) 됩니다. 즉 @splat(5)만 쓰면 결과가 벡터인지 배열인지, 몇 개짜리인지는 문맥(컴파일 타임)에서 정해져요.
실제로 어떤 식으로 동작하는지 테스트로 확인해 볼게요.
const std = @import("std");
const expectEqualSlices = std.testing.expectEqualSlices;
test "vector @splat" {
const scalar: u32 = 5;
const result: @Vector(4, u32) = @splat(scalar);
try expectEqualSlices(u32, &[_]u32{ 5, 5, 5, 5 }, &@as([4]u32, result));
}
test "array @splat" {
const scalar: u32 = 5;
const result: [4]u32 = @splat(scalar);
try expectEqualSlices(u32, &[_]u32{ 5, 5, 5, 5 }, &@as([4]u32, result));
}
$ zig test test_splat_builtin.zig
1/2 test_splat_builtin.test.vector @splat...OK
2/2 test_splat_builtin.test.array @splat...OK
All 2 tests passed.
첫 번째 테스트는 u32 값 5 하나를 @Vector(4, u32) 타입의 벡터로 만드는 경우예요. result의 타입이 정해져 있으니 @splat(scalar)는 4개 요소가 모두 5인 벡터를 만들어요. 두 번째 테스트는 같은 값으로 [4]u32 배열을 채우는 경우죠. 타입이 달라도 @splat은 동일하게 동작하고, 기대값과 실제 결과가 정확히 일치하는 걸 expectEqualSlices로 확인하고 있어요.
이렇게 @splat은 배열과 벡터 양쪽에 똑같이 쓰인다는 점이 핵심이에요. 반환 타입과 요소 개수는 어느 쪽이든 문맥에서 추론되니까, 코드에서는 딱 하나의 스칼라 값만 넘겨주면 됩니다.