Символи - це іменовані ідентифікатори, за допомогою яких можна посилатися на значення.
Символи створюються за допомогою літерала символу: він полягає в тому, що перед іменем ставиться символ :, наприклад :foo.
Їх також можна записувати в лапках, наприклад :"foo", що дозволяє, зокрема, використовувати пробіли в імені.
:foo # => :foo
:"foo boo" # => :"foo boo"
Символи використовуються в багатьох місцях мови, зокрема як ключі в хешах та для позначення назв методів і змінних.
Від рядків тексту (англ. string) символи відрізняє те, що вони є ідентифікаторами й не представляють дані чи текст. Це означає, що два символи з однаковою назвою завжди є тим самим обʼєктом.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
Символи незмінні, тобто їх не можна змінити. Це означає, що коли ми «змінюємо» символ, насправді ми створюємо новий символ. Існує кілька методів, які можна застосовувати до символів, і всі вони повертають нові символи. Усі методи можна знайти в API Symbol.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
Перевага незмінності символів у тому, що вони ефективніше використовують памʼять, ніж рядки тексту, а також безпечніші у використанні як ідентифікатори.
Символи можна перетворювати на рядки тексту й навпаки.
Це може стати в пригоді, коли ми хочемо змінити символ або використати символ як рядок тексту.
Щоб подати рядок тексту як символ, можна скористатися методом String#to_sym, а для зворотного перетворення можна скористатися методом Symbol#to_s.
Оскільки символи мають обмежений набір методів, іноді корисно перетворити символ на рядок тексту, щоб застосувати до нього методи рядків, якщо потрібен новий символ.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
У Ruby можна отримати назви в областях видимості за допомогою різних методів, які повертають назви констант, методів і змінних. Ці методи повертають масиви символів.
Деякі з таких методів: Module#constants, Module#instance_methods, Module#class_variables, global_variables та local_variables.
module Foo
BAR = 1
def self.baz; end
end
a = 1
Foo.constants # => [:BAR]
Foo.instance_methods # => [:baz]
local_variables # => [:a]
Усі методи можна знайти в API Kernel та API Module.