Си

Символи у Ruby

1 вправа

Про концепцію Символи

Символи - це іменовані ідентифікатори, за допомогою яких можна посилатися на значення. Символи створюються за допомогою літерала символу: він полягає в тому, що перед іменем ставиться символ :, наприклад :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.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Символи