Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

17.11.2023

Struct, Data та OpenStruct в Ruby

Типу в продовження колишнього поста про структури в Ruby… Наразі в Ruby є три класи, які пропонують абстракцію “структури даних”. Чому так, в чому різниця, та який треба використовувати?

Насамперед про OpenStruct. Його офіційно рекомендують не використовувати (та видають попередження.) Чому так? Бо це буквально обгортка для звичайного хеша, написана на чистому Ruby. Та було б ще не так погано, якби це був просто хеш — але до нього додається ще метапрограмування, що й утворює не дуже швидкий клас — особливо для низькорівневого використання.

Тепер, Struct та Data. Це класи-брати. Вони мають спільний код та написані на C. Тут для збереження полів використовується масив, а методи утворюються без метапрограмування. Така реалізація і працює швидше, і займає менше памʼяті. Обидва класи утворюють звичайні класи-нащадки, з якими можна робити що завгодно, в тому числі й додавати нові атрибути та методи.

Struct та Data майже у два рази швидше за хеш, тому їх використання має практичний сенс, коли треба зберігати багато однотипних обʼєктів.

Що ж таке новий тип Data? Це обрізана за можливостями Struct, де відсутні методи-сеттери та деякі інші. Технічно, іншої різниці ви там не знайдете. Семантично, це реалізація патерну “value object”, тобто простого незмінного набору даних. Ось детальніше на трекері Ruby. Звісно, незмінність в Ruby відносна та примарна, але все одно має сенс брати Data для коду у функціональному стилі.

До речі, запропонував та реалізував Data харків’янин Віктор Шепелєв.