Другим, ищущим ответы здесь, может быть интересно узнать, что исключение происходит, когда вы используете целые числа в качестве символьных ключей в Ruby хэше {symbol: value}
hash = {1: 'one'} # will not work
hash = {1 => 'one'} # will work
Запрошенное объяснение:
Простейший ответ на вопрос о том, почему первый пример дает сбой, вероятно, заключается в том, что to_sym
не является методом, который был реализован для Fixnum целых чисел.
Чтобы углубиться в объяснение, почему это так, одно из главных преимуществ использования символов состоит в том, что два символа фактически являются "одним и тем же объектом". Или, по крайней мере, они имеют одинаковые идентификаторы объектов.
:foo.object_id == :foo.object_id
=> true
Строки, которые являются одинаковыми, не используют одни и те же объекты и, следовательно, не имеют одинаковые идентификаторы объектов
"foo".object_id == "foo".object_id
=> false
Как и символы, одинаковые целые числа Fixnum будут иметь одинаковые идентификаторы объектов. Поэтому вам не нужно конвертировать их в символы.
one = 1
=> 1
uno = 1
=> 1
one.object_id
=> 3
one.object_id == uno.object_id
=> true