Records는 익명, 불변, 집합 타입으로 다른 컬렉션 타입처럼 여러 객체를 하나의 객체로 묵는다.
=> Unlike other collection types, records are fixed-sized, heterogeneous, and typed.
Record 표현식은 괄호안의 ,
로 구분된 named 혹은 positional 필드이다.
=> var record = ('first', a: 2, b: true, 'last');
파라미터와 리턴 타입에 Record를 사용할 땐, 괄호에 타입을 넣으면 된다.
=> (int, int) wap((int, int) record) {...}
Record의 named 필드는 Record 타입의 일부이다.
({int a, int b}) recordAB = (a: 1, b: 2);
({int x, int y}) recordXY = (x: 3, y: 4);
// Compile error! These records don't have the same type.
// recordAB = recordXY;
positional 필드에도 이름을 붙일 수 있지만, 이 이름은 타입의 일부가 아니다
(int a, int b) recordAB = (1, 2);
(int x, int y) recordXY = (3, 4);
recordAB = recordXY; // OK.
=> 함수의 positional 파라미터의 이름이 함수의 시그니처에 영향을 주지 않는 것과 동일
Record는 built-in getter를 통해 접근할 수 있다.
=> Record는 불변이기 때문에 setter는 없음
named 필드에 대해 동일한 name으로 접근할 수 있고, positional 필드에 대해 $<position>
형태로 positional 필드의 순서를 통해 접근할 수 있다.
=> 이때, named 필드는 순서에서 무시된다.
=> var record = ('first', a: 2, 'last')
=> record.$1
= 'first'
=> record.a
= 2
=> record.$2
= 'last'
Record는 별개의 타입 선언이 존재하지 않고, 필드에 의해 타입이 지정된다.
Record의 형태(필드, 필드의 타입, 필드의 이름)가 Record의 타입을 결정한다.
Record는 내부에 다양한 타입을 동시에 담을 수 있다.
(num, Object) pair = (42, 'a');
var first = pair.$1; // Static type `num`, runtime type `int`.
var second = pair.$2; // Static type `Object`, runtime type `String`.