@hasField

@hasField

구조체(struct), 유니온(union), 또는 이넘(enum)에 특정 필드 이름이 실제로 존재하는지 컴파일 타임에 확인하고 싶을 때 쓰는 내장 함수예요. 스펙이 늘거나 줄어드는 타입을 다룰 때, 어떤 필드가 있는지 런타임 전에 미리 검사해 두고 싶다면 이 빌트인이 딱 알맞아요.

출처: Zig Documentation

본문

선언은 이렇게 생겼어요.

@hasField(comptime T: type, comptime name: []const u8) bool

타입 T에 대해, name에 준 필드 이름이 존재하는지 bool로 돌려줘요. Tname 둘 다 comptime이라 컴파일 타임에 평가되는 값이에요.

핵심 동작 몇 가지만 짚어볼게요.

  • 결과는 컴파일 타임 상수예요. 런타임이 아니라 빌드 시점에 이미 값이 결정되고, ifswitch 같은 곳에서 컴파일 타임 분기에 그대로 활용할 수 있어요.
  • 함수, 변수, 상수는 세어 주지 않아요. 이 빌트인은 어디까지나 타입의 필드(field)만 대상으로 해요.

예를 들어 어떤 이넘 타입에 특정 태그가 있는지 확인하고 싶다면, @hasField(MyEnum, "someTag") 같은 식으로 물어보면 돼요. 컴파일 타임에 참/거짓이 결정되므로, 없는 필드를 실수로 참조하는 실수를 컴파일 시점에 막아 주는 역할도 해요.

더 알아보기

  • 어떤 선언(declaration)이 존재하는지는 비슷한 이름의 @hasDecl 빌트인으로 확인할 수 있어요.