У меня нет большого опыта программирования. Но мне Структура кажется несколько подобной Хешу.
После поиска с помощью Google понятие Структуры важно в C, но я не знаю много о C.
Структуры отличаются от использования хэш-карт следующим образом (помимо того, как выглядит код):
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 (имя, возраст, адрес)
).
В качестве примечания: C-структуры практически не имеют ничего общего с рубиновыми структурами, поэтому не позволяйте себе запутаться в этом.
Из документации Struct :
Struct - это удобный способ связать несколько атрибутов вместе, используя методы доступа, без необходимости писать явный класс.
С другой стороны, Хеш :
Хеш - это набор пар ключ-значение. Он похож на массив, за исключением того, что индексация выполняется с помощью произвольных ключей любого типа объекта, а не целочисленного индекса. Порядок, в котором вы проходите хэш по ключу или по значению, может показаться произвольным и обычно не соответствует порядку вставки.
Основное различие заключается в том, как вы получаете доступ к своим данным.
ruby-1.9.1-p378 > Point = Struct.new(:x, :y)
=> Point
ruby-1.9.1-p378 > p = Point.new(4,5)
=> #<struct Point x=4, y=5>
ruby-1.9.1-p378 > p.x
=> 4
ruby-1.9.1-p378 > p.y
=> 5
ruby-1.9.1-p378 > p = {:x => 4, :y => 5}
=> {:x=>4, :y=>5}
ruby-1.9.1-p378 > p.x
NoMethodError: undefined method `x' for {:x=>4, :y=>5}:Hash
from (irb):7
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
ruby-1.9.1-p378 > p[:x]
=> 4
ruby-1.9.1-p378 > p[:y]
=> 5
Короче говоря, вы должны создать новую структуру, если вам нужен класс, представляющий собой структуру «простых старых данных» (необязательно с намерением расширить ее дополнительными методами), и вы должны использовать Hash когда вообще не нужен формальный шрифт.