@splat — 배열·벡터의 모든 요소를 같은 값으로 채우기

@splat — 배열·벡터의 모든 요소를 같은 값으로 채우기

벡터의 각 요소를 전부 같은 값으로 채워야 할 때가 있어요. 예컨대 "이 벡터를 전부 5로 채워서 만들고 싶다" 같은 상황이죠. 요소를 하나하나 나열하는 대신, 한 값만 주면 그걸 반복해서 배열이나 벡터로 만들어 주는 내장 함수가 @splat이에요.

출처: Zig Documentation

본문

시그니처는 이렇게 생겼어요.

@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.

첫 번째 테스트는 u325 하나를 @Vector(4, u32) 타입의 벡터로 만드는 경우예요. result의 타입이 정해져 있으니 @splat(scalar)는 4개 요소가 모두 5인 벡터를 만들어요. 두 번째 테스트는 같은 값으로 [4]u32 배열을 채우는 경우죠. 타입이 달라도 @splat은 동일하게 동작하고, 기대값과 실제 결과가 정확히 일치하는 걸 expectEqualSlices로 확인하고 있어요.

이렇게 @splat배열과 벡터 양쪽에 똑같이 쓰인다는 점이 핵심이에요. 반환 타입과 요소 개수는 어느 쪽이든 문맥에서 추론되니까, 코드에서는 딱 하나의 스칼라 값만 넘겨주면 됩니다.

더 알아보기 (Learn more)

  • Vectors — 벡터 타입
  • Arrays — 배열 타입
  • @shuffle — 벡터 요소를 재배열하는 내장 함수