#ruby #language-design
#ruby #язык-дизайн
Вопрос:
В Ruby есть встроенный класс called Hash
. Согласно документам:
Хэш — это похожий на словарь набор уникальных ключей и их значений. Также называемые ассоциативными массивами, они похожи на массивы, но там, где массив использует целые числа в качестве своего индекса, хэш позволяет использовать любой тип объекта.
…
Хэш можно легко создать, используя его неявную форму:
grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
Итак, по сути, это ассоциативные массивы. Если это так, то почему они называются хэшами? Разве в информатике термин «хэш» обычно не используется для обозначения числа или какой-либо шестнадцатеричной строки, сгенерированной путем прогона некоторых данных через хэш-функцию? Фактически, у объектов Ruby даже есть вызываемый метод hash
, который «генерирует хэш-значение Fixnum для этого объекта».
Я знаю, что Hash
в Ruby реализовано как хэш-таблица, но, учитывая то, что я сказал выше, это не кажется достаточным оправданием для использования имени Hash
вместо чего-то вроде Table
или Map
, особенно учитывая, что Ruby, похоже, не имеет других встроенных реализаций ассоциативных массивов. Почему было выбрано это имя?
Ответ №1:
Ruby черпает вдохновение из Perl, и Perl называет это хэшем.
Обновить:
Подтверждено Юкихиро Мацумото, создателем Ruby: https://twitter.com/yukihiro_matz/status/547516495249428480
Комментарии:
1. Хм, тогда, возможно, по историческим причинам. Этот ответ вызывает вопрос: почему Perl выбрал термин «хэш» вместо «карта», «дикт», «таблица» или «ассоциативный массив»?
2. Настолько хороший ответ, насколько вы, вероятно, получите. Но тогда возникает вопрос… почему Perl называет это хэшем?
3. Я не могу найти авторитетный источник, но, похоже, консенсус заключается в том, что ассоциативные массивы в Perl в конечном итоге в основном называются хэшами, потому что они используют внутреннее хеширование, а «хэш» значительно короче и проще произносить / записывать, чем «ассоциативный массив».
4. @AndrewMedico Не могли бы вы опубликовать любые найденные вами источники, если вы их все еще помните?
5. @Ajedi32, поскольку это лучший ответ, который вы, вероятно, получите, не могли бы вы пометить его как ответ?