배열 옵셔널리티 — 첫 원소가 배열 전체를 대표
배열 컬럼들이 필수 여부를 서로 다르게 적었을 때 무엇으로 읽는지의 설계입니다.
어느 컬럼이 정하는가는 그대로이고, 무엇을 정하는가가 바뀌었습니다. 원소가 없을 수 있는 배열에서 첫 컬럼의
?는 원소가 없을 수 있다는 뜻입니다 — 접힌 그룹의 타입 칸은 원소 하나를 선언하므로, 그 표시도 원소의 것입니다. 배열 전체의 없음은 그 그룹에 표기가 없습니다. 아래의 「첫 원소가 전부를 대표한다」는 결론은 그대로입니다.
규칙
첫 원소의 표시가 배열 전체의 표시입니다. 타입과 같습니다.
Layer[0] Layer[1] Layer[2]
required 1 - -
Layer[0]·Layer[1]·Layer[2]는 같은 필드를 세 번 본 것입니다. 타입도 하나, 이름도
하나이고, 「값이 없는 로우가 있을 수 있는가」도 하나입니다 — 그리고 그 답은 첫 컬럼이 갖고
있습니다.
뒤 컬럼들의 표시는 아무 뜻도 없습니다. 엄밀히 하자면 첫 컬럼과 같게 적는 것이 깔끔하지만, 읽는 쪽에서는 보지 않으므로 고칠 것이 있는 시트가 아닙니다.
SerialField.Type이 이미 그렇게 합니다. 그룹의 타입은Fields[0].Type이고, 원소마다 다른 타입을 적을 수 있는 것이 아닙니다. 필수 여부만 다르게 취급할 이유가 없습니다.
레코드 — 멤버 단위 판정
Slot[0]["Id"] Slot[0]["Count"] Slot[1]["Id"] Slot[1]["Count"]
Id와 Count는 서로 다른 컬럼이고 타입도 다릅니다. 그래서 필수 여부도 각자 정하고,
Id의 답은 Slot[0]["Id"]가, Count의 답은 Slot[0]["Count"]가 갖습니다.
이 구별은 이 표기를 쓰는 시트가 필드에 붙는 표시와 오브젝트 안의 필드에 붙는 표시를 따로 두는 것과 같습니다.
경과 — 두 차례의 오독
기록해 둡니다. 같은 자리를 다시 지나갈 사람이 있기 때문입니다.
| 읽은 것 | 왜 틀렸나 |
|---|---|
| 오류. 엇갈리면 통일하라고 요구 | 시트는 틀린 말을 하고 있지 않았습니다. 통일하면 원래 뜻이 사라집니다 |
| 최소 길이. 「원소가 최소 N개」 | 뒤 컬럼의 표시에 뜻이 있다고 가정한 것인데, 없습니다 |
두 번 다 시트에 적힌 것보다 많은 뜻을 읽으려 한 것이 원인이었습니다. 표기 규격 문서와 데이터를 직접 확인해서야 「첫 원소가 전부」라는 결론이 나왔습니다.
함께 고친 것 — 자르기가 스칼라 배열에도
자르기 옵션이 — 그때는 이름도 TrimTrailingRecordElements였습니다 — 레코드 배열에만
걸려 있었습니다. 실제 워크북에서
Layer[0..6] 중 넷만 채운 로우가 길이 7로 나왔고, 그쪽 익스포터는 4를 냅니다.
자르기는 「원소가 어디서 끝나는가」에 대한 답이고, 그 질문에 원소의 생김새는 상관이 없습니다. 가변 길이 레코드 배열이 정한 규칙 — 뒤에서만 자르고 가운데는 유지 — 은 그대로입니다.