Структуры отличаются от использования хеш-карт следующими способами (в дополнение к тому, как выглядит код):
- Структура имеет фиксированный набор атрибутов, в то время как вы добавляете новые ключи в хеш.
- Вызов атрибута, который не существует в экземпляре структуры, вызовет NoMethodError, а получение значения для несуществующего ключа из хеша просто вернет nil.
- Два экземпляра разных структур никогда не будут равны, даже если структуры имеют одинаковые атрибуты и экземпляры имеют одинаковые значения (т. Е.
Struct.new(:x).new(42) == Struct.new(:x).new(42)
- ложь, тогда как Foo = Struct.new(:x); Foo.new(42)==Foo.new(42)
- истина).
- Метод
to_a
для структур возвращает массив значений, тогда как to_a
для хэша возвращает массив пар ключ-значение (где «пара» означает «массив из двух элементов»)
- Если
Foo = Struct.new(:x, :y, :z)
, вы можете сделать Foo.new(1,2,3)
, чтобы создать экземпляр Foo
без необходимости прописывать имена атрибутов.
Итак, чтобы ответить на вопрос: если вы хотите моделировать объекты с известным набором атрибутов, используйте структуры. Если вы хотите смоделировать произвольное использование хеш-карт (например, подсчет того, как часто каждое слово встречается в строке или сопоставление псевдонимов с полными именами и т. Д., Безусловно, не являются заданиями для структуры, в то время как моделирование человека с именем, возрастом и адресом будет идеально подходит для Person = Struct.new(name, age, address)
).
Как замечание: структуры C имеют мало общего с рубиновыми структурами, так что не позволяйте себе запутаться.