Що є символом у Рубі?


45

Я абсолютно новий у світі Рубі, і я трохи плутаюся з поняттям Символи. Яка різниця між символами та змінними? Чому б не просто використовувати змінні?

Дякую.


у Ліспі - від якого походить Рубі - символ по суті є типом даних для змінної; це означає, що ви можете маніпулювати програмою в режимі рефлексії під час її виконання. (не найскладніше пояснення, вибачте)
Пол Натан

Відповіді:


70

Змінні та символи - це різні речі. Змінна вказує на різні типи даних. У Ruby символ більше нагадує рядок, ніж змінну.

У Ruby рядок є змінною, тоді як символ є незмінним. Це означає, що потрібно створити лише одну копію символу. Таким чином, якщо у вас є

x = :my_str
y = :my_str

:my_strбуде створено лише один раз xі буде yвказувати на ту саму область пам’яті. З іншого боку, якщо у вас є

x = "my_str"
y = "my_str"

рядок , що містить my_strбуде створена в два рази , а xі yбуде вказувати на різні інстанції.

В результаті символи часто використовуються як еквівалент переліків у Ruby, а також ключі до словника (хеш).


1
Тільки щоб підказати точку @ mipadi, коли ви порівнюєте рядок, вам потрібно порівняти кожен символ один проти одного. Отже, порівнюючи однакові рядки - це O (n). Тоді як рубінові символи порівнюють посилання на об'єкти, якими є O (1).
Джеремі Хайлер

Чому у Python цього немає?
Робота

Ви повинні бути обережними, щоб також не зловживати ними, оскільки, востаннє я знав, але я не переглянув це в рубіні> 1.9, символи не отримують gc'd і тому можуть з'їсти пам'ять
frogstarr78

У Smalltalk вони поводяться однаково, за винятком того, як вони виглядають #mySymbol.
Френк Ширар

@ frogstarr78 - Якщо ви програмно не створюєте символи (інтернуючі рядки, не перевіряючи їх спочатку), вам не доведеться турбуватися про створення занадто багато символів.
Джастін Л.

16

Символ у Ruby - це те саме, що символ у реальному світі. Він використовується, щоб щось зобразити чи назвати.

Символи дуже часто використовуються для представлення якогось стану, наприклад

order.status = :canceled
order.status = :confirmed

Ви також можете розглядати символ як миттєвий перерахунок. Не потрібно визначати символ, ви просто використовуєте його. Ця стаття пояснює це дуже докладно.


1
Краще пояснення, ніж більшість, що мені здається поки що.
Юрій Генцев

0

Зазвичай змінні зазвичай плутають із рядками, але я можу зрозуміти, що ти думаєш про це як про змінну. Це зрозуміло. Подумайте про це так:

Статус гравця в грі представлений цифрою. 1 означає живий, 2 означає невпевнений, 3 означає мертвий. Це легко замінити символами. Символами можуть бути :alive :unsureі :dead. Щоб перевірити, чи гравець живий, замість цього:

if player_status == 1

Ви можете зробити це:

if player_status == :alive

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.