Ruby/Переменные

Материал из Викиучебника — открытых книг для открытого мира

Переменные[править]

Переменные используются, чтобы сохранить промежуточный результат вычислений. Имя переменной в Ruby должно:

  • начинаться с буквы или знака подчёркивания;
  • состоять из латинских букв, цифр или знака подчёркивания.

Примеры переменных:

array
variable
another_variable
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                    #=> "Татьяна"

Дятел