Объясните разницу между символами и строками.ruby-4

Строки

Строки - это изменяемые (mutable) последовательности символов, используемые для работы с текстовыми данными.

str = "hello"
str.object_id # => 60 (например)
str << " world" # Модифицируем существующую строку
str.object_id # => 60 (остается тем же)

Характеристики строк:

  • Изменяемы (можно менять содержимое)
  • Занимают больше памяти
  • Создают новый объект при каждом литерале
  • Поддерживают интерполяцию ("Value: #{var}")

Символы

Символы - это неизменяемые (immutable) идентификаторы, используемые преимущественно как метки.

sym = :hello
sym.object_id # => 123456 (например)
sym.upcase # => :HELLO (возвращает новый символ)
sym.object_id # => 123456 (остается прежним)

Характеристики символов:

  • Неизменяемы
  • Занимают фиксированное место в памяти
  • Все одинаковые символы ссылаются на один объект
  • Не поддерживают интерполяцию

Ключевые различия

ХарактеристикаСтроки (String)Символы (Symbol)
ИзменяемостьДаНет
Использование памятиБольшеМеньше
Повторное использованиеНовый объектОдин объект
Основное назначениеТекстИдентификаторы
Скорость сравненияМедленнееБыстрее

Когда что использовать?

Используйте строки когда:

  • Нужно работать с текстовыми данными
  • Требуется модификация содержимого
  • Используется интерполяция переменных

Используйте символы когда:

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

Примеры использования

# Плохо (строки как ключи хэша)
{ "name" => "John", "age" => 30 }

# Хорошо (символы как ключи хэша)
{ name: "John", age: 30 }

# Строки для текстовых операций
"Hello #{user.name}".downcase.split

# Символы для идентификации
send(:update) if respond_to?(:update)

Преобразование между типами

"hello".to_sym # => :hello
:hello.to_s # => "hello"
"hello".intern # => :hello (аналог to_sym)

Резюмируем

  1. Строки - для текста, изменяемы, поддерживают интерполяцию
  2. Символы - для идентификаторов, неизменяемы, эффективны
  3. Символы предпочтительнее для ключей хэшей и меток
  4. Строки необходимы при работе с пользовательским вводом и модификацией текста
  5. Всегда используйте правильный тип в зависимости от задачи