Мне нравится "определение произвольных атрибутов", и я думаю, что OpenStruct в рубине иногда кажется более чистым, чем использование хэша, но мне любопытно, существуют ли другие конкретные преимущества или используются случаи, которые делают OpenStruct лучшим выбором чем просто использовать хэш.
Когда следует использовать OpenStruct вместо Hash?
Ответ 1
Я думаю, что это в основном сводится к решению о производительности. Из Ruby Documentation:
OpenStruct использует структуру поиска Rubys для поиска и определения и определения необходимых методов для свойств. Это достигается с помощью метода method_missing и define_method.
Это должно быть рассмотрено, если есть проблема с производительностью создаваемых объектов, поскольку в настройке этих свойств существует намного больше накладных расходов по сравнению с использованием Hash или Struct.
Кроме того, что-то вроде Hash
имеет дополнительную функциональность со всеми способами, которые он предоставляет (has_key?
, include?
и т.д.). OpenStruct
- это очень простой объект с этой точки зрения, но если у вас нет проблем с точки зрения производительности и просто нужен простой объект для работы, OpenStruct
- хороший выбор.
Ответ 2
OpenStruct
объекты полезны, когда вам нужно что-то, чтобы соответствовать определенному интерфейсу вызова метода (т.е. отправить объект с утиным типом, отвечающий на #name
и #value
), или когда вы хотите инкапсулировать детали реализации, но также хотят избежать чрезмерной разработки решения. Они также создают потрясающий объект-заглушку, и я часто использую их вместо фрейм-заглушек, когда мне не нужны накладные расходы на заглушку/макет.