Вопрос о языке: поле записи с анонимной записью (?) Типа ...? - PullRequest
0 голосов
/ 12 января 2019

Я все еще изучаю Delphi / OP и наткнулся на приведенный ниже (упрощенный) код, который является частью упражнения в старой книге Delphi.

type
  TMyRec = record
    FField1: Integer;
    FField2: String;

    FAnonRec: record
      FAnonField: Integer;
    end;

    FField3: Boolean;
  end;

Мой главный вопрос:
1. Что бы FAnonRec - точнее, его тип - было бы названо в языковых терминах? Как мне сослаться на это? Что-то вроде поля записи типа анонимной записи ...? Просто сконструированный тип ...? - Я некоторое время гуглил свой вопрос, но продолжал получать результаты о древнегреческой истории ... Самое близкое, что я нашел, было это объяснение ошибки .

Дополнительные вопросы:
2. В целом, как называется этот тип конструкции («создание типа» прямо здесь и сейчас вместо использования предварительно объявленного именованного типа)? - независимо от того, используется ли он как в примере или в блоке var, или даже если запись не используется.
3. Инструмент «Структура» в Delphi показывает только FField1 и FField2:
delphi structure
- но инструмент «Class Explorer» показывает всю запись:
image
- кто-нибудь знает почему?
4. Пункт 3 и тот факт, что это из старой книги, и тот факт, что мне трудно найти какую-либо дополнительную информацию об этом, заставляет меня задуматься, не является ли такая конструкция устаревшей / обескураженной?

1 Ответ

0 голосов
/ 12 января 2019

Я бы назвал это «определением типа вложенной записи». Он существует с момента появления Turbo Pascal IIRC и не имеет ничего общего с недавно введенными «анонимными методами» (по крайней мере, в этом столетии), которые представляют собой гораздо более сложного зверя, поскольку он захватывает с ним некоторый контекст выполнения.

Я не вижу причин, по которым это может показаться устаревшим или обескураженным. Это идеальная правильная структура, которая имеет смысл с точки зрения кода, поскольку она собирает некоторые поля в логическом родительском поле. Конечно, если вы ожидаете получить к нему доступ независимо, выделенное определение типа того стоит. Производительность будет такой же, было бы просто удобнее, если бы YAGNI (меньше печатал, вся запись видна с первого взгляда).

Таким образом, вы можете начать с написания таких вложенных записей, а затем при необходимости определить выделенный тип - например, если добавление некоторых методов может сделать ваш код более читабельным и обслуживаемым. На практике использование вложенных записей в определениях типов может уменьшить возможное изменение кода в вашей кодовой базе, поскольку позднее добавление явного определения типа не нарушит доступ к его элементам из существующего кода.

Обратите внимание, что для него есть RTTI, как отдельная запись, названная в честь "основной" записи (что-то вроде '__TMyRec_FAnonRec'). Таким образом, с точки зрения RTTI, это не анонимно. ;)

...