Что такое символ в Ruby?

45

Я совершенно новичок в мире Ruby, и меня немного смущает концепция символов. В чем разница между символами и переменными? Почему бы просто не использовать переменные?

Благодарю.

wassimans
источник
в Лиспе - из которого происходит Ruby - символ по сути является типом данных для переменной; это означает, что вы можете манипулировать программой в стиле Reflection по мере ее выполнения. (не самое понятное объяснение, извините)
Пол Натан

Ответы:

70

Переменные и символы - это разные вещи. Переменная указывает на различные виды данных. В Ruby символ больше похож на строку, чем на переменную.

В Ruby строка изменчива, а символ неизменен. Это означает, что необходимо создать только одну копию символа. Таким образом, если у вас есть

x = :my_str
y = :my_str

:my_strбудет создан только один раз xи yуказывает на ту же область памяти. С другой стороны, если у вас есть

x = "my_str"
y = "my_str"

строка , содержащая my_strбудет создана в два раза , а xи yбудет указывать на различные инстанции.

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

mipadi
источник
1
Просто чтобы подчеркнуть точку @ mipadi, когда вы сравниваете строку, вам нужно сравнивать каждый символ друг с другом. Таким образом, сравнение одинаковых строк - это O (n). Принимая во внимание, что рубиновые символы сравнивают ссылки на объекты с O (1).
Джереми Хейлер
Почему у Python этого нет?
Работа
Вы должны быть осторожны, чтобы не злоупотреблять ими также, так как, как я знал в прошлый раз, но я не изучал это в ruby> 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

sirsnow
источник