Большинство книг или онлайн-ресурсов, которые я видел, все используют записи для хранения состояния процесса (вероятно, потому, что это был путь для большего (?), Чем десятилетия). С другой стороны, карты эффективно используются для замены кортежей в stdlib (например, childspecs in the supervisor module).Есть ли преимущества в использовании карт вместо записей для хранения состояний в процессах Erlang?
В качестве примера, я работаю свой путь через Learn You Some Erlang's Finite State Machines главы и state
записи может быть заменена на карте, объявленной в init/1
обратного вызова необходимой gen_fsm
.
- Декларация запись не будет нужна, и большинство из того, что я читал до сих пор, лучшая практика, чтобы держать их местные все равно, как
.hrl
файлы сделать это труднее отслеживать ошибки. - Ссылаясь на состояние процесса в предложениях функций, также будет короче, но оба они ясно передают структуру переменной состояния, а пара дополнительных символов не вызывает беспокойства.
Кроме того, было бы более эффективным?
Я знаю, что хорошо продуманный бенчмарк ответит на мой вопрос, но я всего пару недель изучаю Эрланг, а mapsmodule довольно новый и еще changing.
UPDATE: Благодаря I Give Ужасные КОНСУЛЬТАЦИИ, я прочитал LYSE chapter on maps более тщательно и ответ ясен:
Использование записей имеет то преимущество, что ключи известны во время компиляции времени, что приносит преимущества
- быстрый доступ к определенным значениям (быстрее, чем это возможно динамически)
- дополнительной безопасности (аварии в начале, а не развращать состояние)
- проще типа проверкой
Они делают записи абсолютно подходят для процесса внутреннего состояния, несмотря на случайном бремя написания более подробную функции code_change.
С другой стороны, когда пользователи Erlang будут использовать записи для представления сложных структур данных вложенного ключа/значения (как ни странно, подобных объекты в объектно-ориентированных языках), которые часто пересекает модуль границы, карта поможет много , Записи были неправильным инструментом для этой работы .
с использованием карт для дочерних спецификаций супервизора также позволял им предоставлять значения по умолчанию, когда ключи не предоставляются, например. перезапуск; который может уменьшить количество требуемого шаблона – grahamrhay