Когда мне следует использовать OpenStruct вместо хеша?

Мне нравится «определение произвольных атрибутов», и я думаю, что OpenStruct в ruby ​​иногда кажется более чистым, чем использование хэша, но мне любопытно, есть ли другие конкретные преимущества или варианты использования, которые делают OpenStruct лучшим выбором, чем простое использование Хеш.


person mkelley33    schedule 20.01.2013    source источник
comment
ОС работает медленно, но отлично подходит для прототипирования.   -  person Dave Newton    schedule 20.01.2013


Ответы (2)


Я думаю, что это в основном сводится к решению о производительности. Из документации Ruby:

OpenStruct использует структуру поиска методов Ruby для поиска и определения необходимых методов для свойств. Это достигается с помощью методов method_missing и define_method.

Это следует учитывать, если есть опасения по поводу производительности создаваемых объектов, поскольку при настройке этих свойств накладные расходы намного выше, чем при использовании Hash или Struct.

Кроме того, что-то вроде Hash имеет дополнительные функции со всеми предоставляемыми им методами (has_key?, include? и т. Д.). OpenStruct - очень простой объект с этой точки зрения, но если у вас нет никаких проблем с точки зрения производительности и вы просто хотите, чтобы с ним было легко работать, OpenStruct - хороший выбор.

person Marc Baumbach    schedule 20.01.2013
comment
В качестве дополнительного предостережения, в Ruby 1.9.3 (по крайней мере) вся работа выполняется при создании OpenStruct, а не при первом использовании метода. Это делает OpenStruct дорогим, даже если вы никогда не обращаетесь к функциям-членам. (Не знаю, было ли это исправлено в более поздней версии). - person MZB; 21.04.2016

Объекты OpenStruct полезны, когда вам нужно что-то, чтобы соответствовать определенному интерфейсу вызова метода (например, отправить объект типа утка, отвечающий на #name и #value), или когда вы хотите инкапсулировать детали реализации, но также хотите избежать чрезмерной разработки решение. Они также создают отличный объект-заглушку, и я часто использую их вместо заглушек фреймворка, когда мне не нужны накладные расходы на заглушку / макет.

person Jim Deville    schedule 20.01.2013
comment
+1 За упоминание об их использовании в тестировании. Я широко использую их для заглушки связанных с HTTP битов данных при тестировании вызовов API / веб-сервисов. Довольно круто, как только вы освоитесь. - person Kyle Carlson; 01.09.2013