Я совершенно новичок в мире 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, а также ключей от словаря (хеш).
Просто чтобы подчеркнуть точку @ mipadi, когда вы сравниваете строку, вам нужно сравнивать каждый символ друг с другом. Таким образом, сравнение одинаковых строк - это O (n). Принимая во внимание, что рубиновые символы сравнивают ссылки на объекты с O (1).
Джереми Хейлер
Почему у Python этого нет?
Работа
Вы должны быть осторожны, чтобы не злоупотреблять ими также, так как, как я знал в прошлый раз, но я не изучал это в ruby> 1.9, символы не получают gc'd и поэтому могут съесть память
frogstarr78
Они ведут себя одинаково в Smalltalk, за исключением того, что они похожи #mySymbol.
Фрэнк Шиарар
@ frogstarr78 - Если вы не генерируете символы программно (интернирование строк без их предварительной проверки), вам не нужно беспокоиться о создании слишком большого количества символов.
Джастин Л.
16
Символ в Ruby - это то же самое, что и символ в реальном мире. Он используется для представления или имени чего-либо.
Символы очень часто используются для представления какого-либо состояния, например
order.status =:canceled
order.status =:confirmed
Вы также можете посмотреть на символ как на мгновенное перечисление. Вам не нужно определять символ, вы просто используете его. Эта статья объясняет это очень подробно.
Лучшее объяснение, чем большинству, мне пока кажется.
Юрий Генсев
0
Обычно переменные обычно путают со строками, но я понимаю, что вы думаете, что это переменная. Это понятно. Думайте об этом так:
Статус игрока в игре представлен числом. 1 означает живой, 2 означает неуверенный, 3 означает мертвый. Это может быть легко заменено символами. Символы могут быть :alive:unsureи :dead. Чтобы проверить, жив ли игрок, вместо этого:
Ответы:
Переменные и символы - это разные вещи. Переменная указывает на различные виды данных. В Ruby символ больше похож на строку, чем на переменную.
В Ruby строка изменчива, а символ неизменен. Это означает, что необходимо создать только одну копию символа. Таким образом, если у вас есть
:my_str
будет создан только один разx
иy
указывает на ту же область памяти. С другой стороны, если у вас естьстрока , содержащая
my_str
будет создана в два раза , аx
иy
будет указывать на различные инстанции.В результате символы часто используются в качестве эквивалента перечислений в Ruby, а также ключей от словаря (хеш).
источник
#mySymbol
.Символ в Ruby - это то же самое, что и символ в реальном мире. Он используется для представления или имени чего-либо.
Символы очень часто используются для представления какого-либо состояния, например
Вы также можете посмотреть на символ как на мгновенное перечисление. Вам не нужно определять символ, вы просто используете его. Эта статья объясняет это очень подробно.
источник
Обычно переменные обычно путают со строками, но я понимаю, что вы думаете, что это переменная. Это понятно. Думайте об этом так:
Статус игрока в игре представлен числом. 1 означает живой, 2 означает неуверенный, 3 означает мертвый. Это может быть легко заменено символами. Символы могут быть
:alive
:unsure
и:dead
. Чтобы проверить, жив ли игрок, вместо этого:if player_status == 1
Вы могли бы сделать это:
if player_status == :alive
источник