Символы являют собой аналог простых строк, но отличаются от них тем, что занимают в неизменное место в памяти. То есть, если сделать хэш
{'title' => 'There is no spoon'}
, то
'title'
каждый раз будет занимать новое место в памяти. С другой стороны, в хэше вида
{title: 'There is no spoon'}
символ
:title
будет каждый раз занимать одну и ту же позицию в памяти. Несложно сделать вывод, что использование символов экономит память при работе программы.
Пример со строкой:
2.1.5 :004 > 'title'.object_id
=> 70319227477100
2.1.5 :005 > 'title'.object_id
=> 70319227461020
2.1.5 :006 > 'title'.object_id
=> 70319227447980
2.1.5 :007 > 'title'.object_id
=> 70319227431260
Пример с символом:
2.1.5 :008 > :title.object_id
=> 1145928
2.1.5 :009 > :title.object_id
=> 1145928
2.1.5 :010 > :title.object_id
=> 1145928
2.1.5 :011 > :title.object_id
=> 1145928
2.1.5 :013 >
Конечно, различия в использовании памяти могут быть незначительными, но так уж повелось. В принципе, эту традицию можно считать соглашением. Ну и стоит упомянуть, что это соглашение оказалось настолько популярным, что в Ruby 1.9 ввели возможность писать хэши с символами в качестве ключей вот так:
{key: 'value'}
(до 1.9 было так:
{:key => 'value'}
).
P.S. Для понимания Руби читать Programming Ruby 1.9 & 2.0, для понимания Рельс -- The Rails 4 Way.