В последних версиях Elixir Access уже реализован не как протокол, а как поведение. Насколько я понимаю, это изменение было мотивировано соображениями производительности в режиме разработки.
Теперь, глядя на реализацию, мне интересно, как это работает внутри и почему эта реализация была выбрана. Как мы можем видеть здесь, Access отправляет в модуль struct через ключ "__struct__" соответствующей карты. AFAICS, это примерно работает как полиморфизм в стиле ООП. Несколько вопросов по этому поводу:
- Почему это быстрее?
- Каковы недостатки по сравнению с протоколами? Из того, что я могу сказать, это менее расширяемый. Есть ли другие?
- До сих пор я видел только поведение в контексте таких вещей, как GenServer, где модуль обратного вызова захватывается при инициализации и сохраняется в процессе (по крайней мере, я так полагаю). Здесь поведение Access захватывает модуль обратного вызова из данных. Было бы возможно даже реализовать это поведение для чего-то, что не является структурой?
- Является ли такого рода рассылка распространенной передовой практикой в эрланге или эликсире, когда никто не заинтересован в дополнительном преимуществе, которое даст протокол?