Я использую enum
для сопоставления целых чисел в моей базе данных с семантическими значениями в моем рубиновом коде, однако я заметил, что ключи, которые он использует, являются строками. Когда я проверил тип хеша, я обнаружил, что это ActiveSupport::HashWithIndifferentAccess
, а не стандартный Hash
, что имеет смысл, но приводит к вопросу о том, почему Rails решил хранить и сравнивать значения как строки, а не символы внутри.Почему ключи Rails `HashWithIndifferentAccess` хранятся в виде строк, а не символов?
В documentation состояния:
Внутренне символы отображаются в строках, когда используются в качестве ключей в целом интерфейс написания
Символы, как правило, используются в хэшей из-за их быстрого сравнения, но Rails имеет вместо этого используется вместо них. Почему они решили сделать это и насколько значительна разница в производительности?
Btw символы теперь GCed в Ruby 2.4.0. – ndn
@ndn, если их длина больше или равна 24 байтам, они хранятся в 'RValue', которые ** не ** GC'ed. Google для «рубиновых куч». Возможно, это тоже было изменено в Ruby 2.4, но я в этом сомневаюсь. – mudasobwa