Clause
← Уся документація

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26 · Читати англійською

Native records

Форми record з OTP 29, що виходять за межі звичайних кортежних record: їхнє подання, операції та помилки. Кортежні record описано в термах.

OTP 29 позначає native records як експериментальні. Наведені нижче факти взято із зафіксованих вихідних кодів maint-29 (erl_lint, erl_expand_records, v3_core, beam_core_to_ssa, erts/emulator/beam/erl_record.c, utils.c, erl_printf_term.c) і живих перевірок на OTP 29.1.1.

Обсяг

Усі три форми, що виходять за межі кортежних record, реалізовано, і вони мають спільне подання:

ФормаСинтаксис
Native record, локальний-record #r{...}., #r{...}, X#r.f, X#r{...}, зразки, is_record/1,2,3
Кваліфікований та імпортований#m:r{...}, X#m:r.f, X#m:r{...}, зразки; -export_record, -import_record
Виведений (анонімний)X#_.f, X#_{...}, зразок #_{...}

Модуль рефлексії records надається (рефлексія). Не надаються: term_to_binary для native records (error:notsup, зовнішній формат термів) і гаряче оновлення коду.

Подання

Операції

M — поточний модуль. Усі помилки мають клас error; вмістом badrecord є значення, що спричинило помилку, за винятком невдалого зовнішнього конструювання.

ОпераціяПриймаєНевдача
Локальне конструювання #r{...}Завжди (визначення локальне)Невідоме поле або відсутнє значення — помилки компіляції
Зовнішнє конструювання #m:r{...} (також імпортований #r{...}, також #M:r)m:r визначено в пакеті й експортовано{badrecord, {m, r}}; потім {badfield, {{m, r}, F}}, {novalue, {{m, r}, F}} (badfield має перевагу)
Локальний доступ X#r.fNative record з назвою r (модуль і прапорець експорту не перевіряються, як у runtime OTP){badrecord, X}; поле відсутнє — {badfield, {{Mod, r}, f}}
Зовнішній доступ X#m:r.fМодуль m, назва r, експортований{badrecord, X}; {badfield, ...}
Анонімний доступ X#_.fБудь-який native record (експорт не перевіряється, як у runtime OTP){badrecord, X}; {badfield, ...}
Локальне оновлення X#r{...}Модуль M, назва r{badrecord, X}; невідоме поле — {badfield, ...}
Зовнішнє оновлення X#m:r{...}Експортований, модуль m, назва rтак само
Анонімне оновлення X#_{...}Експортований або модуль Mтак само
Локальний зразок #r{...}Модуль M, назва r, кожне перелічене поле присутнєнемає збігу
Зовнішній зразок #m:r{...}Модуль m, назва r; експортований, якщо перелічено поленемає збігу
Анонімний зразок #_{...}Будь-який native record; експортований або модуль M, якщо перелічено поленемає збігу

Правила часу компіляції

Повідомлення дотримуються erl_lint:

Рефлексія

records відповідає на основі визначення, захопленого record:

Друк і порядок

Збережені відмінності

Порядок полів під час виведення, згортання ==, зовнішнє конструювання незавантажених модулів і відсутні попередження щодо record описано у відмінностях.