Topazdocs
언어 정책

레코드와 명목 데이터

구조적 레코드와 `record`, `enum`, `newtype`의 정체성·생성·복사 규칙.

Topaz는 필드 형태만 비교하는 구조적 레코드와 선언 정체성을 가지는 record, enum, newtype을 명확히 구분합니다.

정책

구조적 레코드 리터럴은 하나 이상의 field: expression을 가집니다. value{ field: replacement }는 얇은 복사본을 만듭니다. record Name, enum Name, newtype Name = Base는 최상위 명목 선언입니다. 생성할 때는 선언 이름을 직접 사용하며, 레코드 기본값은 명시한 필드 뒤에 선언 순서로 평가됩니다. newtype.value()는 한 곁만 벗깁니다.

명시된 동작

구조적 레코드는 필드가 같으면 작성 순서와 관계없이 비교합니다. 명목 값은 먼저 같은 선언에서 만들어졌는지 확인한 뒤 매개값을 비교합니다. Name { ...source, replacements }는 맨 앞에 하나의 스프레드만 허용하며, 새로운 외부 값을 만들고 교체 필드를 왼쪽에서 오른쪽으로 평가합니다. 기본값은 다시 계산하지 않습니다.

제약과 명시적 거부

JavaScript식 { ...value }, 여러 개의 명목 스프레드, 이름공간을 붙인 중괄호 생성, this, &self, &mut self, 빈 명목 레코드 패턴, 중복되거나 없는 필드는 거부됩니다. 필드 형태가 같다는 이유로 명목 값을 구조적 레코드로 취급할 수 없습니다.

유예 경계

제네릭 derive, 동적 프로토콜 배치, 이름공간을 붙인 생성, 열린 명목 패턴, 반사, 상속은 현재 범위 밖입니다. 수신자 메서드는 모듈 최상위의 impl Name 블록에서 변경할 수 없는 self를 값으로 받는 형식만 허용합니다.

예제

TOPAZ
record User {
    name: string,
    age: int = 0,
}

let before: User = User { name: "Ada", age: 36 }
let after: User = User { ...before, age: 37 }
print("{before.age}:{after.age}")

관련 정책