Ruby/Переменные
Переменные
правитьПеременные используются, чтобы сохранить промежуточный результат вычислений. Имя переменной в Ruby должно:
- начинаться с буквы или знака подчёркивания;
- состоять из латинских или русских букв, цифр или знака подчёркивания.
Примеры переменных:
array
variable
another_variable
цена_акции
налог_15_процентов
3element # неправильное имя. Начинается с цифры
_3element # а вот как можно
__ # немного странное, но допустимое имя переменной
Переменная может иметь имя не только латинское, но и русское. Для этого, правда, требуется, чтобы весь текст программы был написан в кодировке UTF-8, а интерпретатор запускался с параметром -KU
.
Присваивание осуществляется знаком равенства (=
), вот так:
array = [1, 2, 3, 4]
variable = array + [1, 2]
another_variable = variable - array
То, что справа от =
, прежде чем стать значением переменной, обычно полностью вычисляется. Наша переменная variable
будет содержать массив [1, 2, 3, 4, 1, 2]
, потому что именно таков результат действия array + [1, 2]
. Плюс (+
) с массивами поступает именно так: прицепляет второй массив в хвост первого.
Переменная another_variable
теперь содержит пустой массив, поскольку операция минус убирает все вхождения элементов массива array
из массива variable
.
Переменные указывают на объект
правитьФокус-покус:
girlfriend = "Татьяна"
goes_on_a_visit = girlfriend
puts girlfriend #=> Татьяна
goes_on_a_visit[0] = "Б" # меняем первую (номер ноль) букву у переменной-строки
puts girlfriend #=> Батьяна
# На первый взгляд странно и неожиданно
Значение, возвращаемое первой переменной, изменилось потому, что в Ruby переменные содержат лишь ссылку на то, что вы им присваиваете.
Сами данные (объект) лежат где-то в другом месте. Ввиду этого естественно, что при прямом изменении самого объекта, на который указывает переменная, все другие переменные, указывающие на этот объект, будут возвращать изменённое значение (также будут изменяться).
Чтобы girlfriend
наша осталась "Татьяна"
, надо в переменную занести её клон:
girlfriend = "Татьяна"
goes_on_a_visit = girlfriend.clone
goes_on_a_visit[0] = "М" # Но изменили мы лишь клон. Дома в сохранности сидит настоящая:
puts girlfriend #=> Татьяна
Можно создавать копии объектов ещё методом .dup
. Разница между ними будет понятна позже.
Для безвредного присваивания новых значений переменным их редко приходится клонировать, ибо большинство методов делают это и так. Даже если вы просто присвоите переменной новое значение, Ruby создаст объект с новым значением и поместит в (уже существующую) переменную ссылку на тот объект:
# …
goes_on_a_visit = "Аристарх" # Создаётся новый объект, переменная переводится на него
p girlfriend #=> "Татьяна"