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


45

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

Благодарю.


в Лиспе - из которого происходит 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, а также ключей от словаря (хеш).


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.