# Символ

Символы в Ruby представляют собой объекты, которые представляют собой неизменяемые строки и используются для определения уникальных идентификаторов. В этом уроке мы рассмотрим основы символов в Ruby и посмотрим, как их можно использовать в вашем коде.

## Создание символов

Символы в Ruby представлены символом двоеточия `:` перед строковым литералом. Например, вот так можно создать символ:

```ruby
hello_world_sym = :hello_world
```

Символы могут также создаваться с помощью метода строки `.to_sym()` и `.intern()`. Оба метода преобразуют строку в символ. Вот к примеру мы создаем тот же самый символ `:hello_world`, но с помощью метода строки `.to_sym()`:

```ruby
hello = "hello_world".to_sym
```

## Использование символов

Символы обычно используются как ключи хэша. Посмотрим на пример:

```ruby
person = {
  :name => "John",
  :age => 30,
  :city => "New York"
}
```

**Важно:** когда вы записываете хэш в формате двоеточия (`{'hello':'world'}`), то ruby **автоматически** превращает ваш строковый ключ в символ

Главное отличие симвоал от строки: **иммутабельность**. Иммутабельность - это состояние объекта быть неизменяемым. В будущих главах мы будет обсуждать устройство хэш таблицы изнутри, где вы поймете почему иммутабльность это очень важно для ключа в хэш структуре, сейчас главное запомнить эту особенность.

А разве строки не иммутабельны ? На самом деле нет. Да, многие методы, которые позволяют изменять строку возвращают новое значение, а исходная строка остается неизменной, но в тоже время многие из этих методов имеют 'двойников' с таким же названием, но с добавлением `!` в конце, которые делают тоже самое, но при этом изменяют и исходную строку тоже. Пример:

```ruby
source_str = "hello world"
new_str = source_str.gsub(/l/, "L")
puts "source string: #{source_str}"
puts "new string: #{new_str}"

new_str = source_str.gsub!(/l/, "L")
puts "source string: #{source_str}"
puts "new string: #{new_str}"
```

Совет: чтобы писать чистый код и получать предсказуемое поведение программы, пользуйтесь только методами, которые не изменяют исходную строку. Пусть это не так дешево по расходу оперативной памяти, зато ошибок будет меньше

## Задание symbol\_string

* Напишите два метода: `convert_string_symbol(str)` и `convert_symbol_string(sym)`. Первый должен принимать в аргументах строку и возвращать его представление в виде символа, второй метод принимает символ в аргументах и должен возвращать его строковое представление.
* Протестируйте методы, переведя ее вашим методом в символ, а после полученный символ обратно в строку
