Когда использовать Структуру вместо Хеша в Ruby?

У меня нет большого опыта программирования. Но мне Структура кажется несколько подобной Хешу.

  • Что может преуспеть Структура?
  • Есть ли что-нибудь, что Структура может сделать, тот Хеш не может сделать?

После поиска с помощью Google понятие Структуры важно в C, но я не знаю много о C.

67
задан warder57 26 January 2016 в 20:43
поделиться

2 ответа

Структуры отличаются от использования хэш-карт следующим образом (помимо того, как выглядит код):

  • Структура имеет фиксированный набор атрибутов, пока вы добавляете новые ключи в хэш.
  • Вызов атрибута, который не существует в экземпляре структуры, вызовет ошибку 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 (имя, возраст, адрес) ).

В качестве примечания: C-структуры практически не имеют ничего общего с рубиновыми структурами, поэтому не позволяйте себе запутаться в этом.

90
ответ дан 24 November 2019 в 14:32
поделиться

Из документации 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 когда вообще не нужен формальный шрифт.

10
ответ дан 24 November 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: