Предыдущий раздел Уровень выше Следующий раздел

Переменные и константы

В этом курсе мы будем использовать так называемые локальные переменные. Имена локальных переменных начинаются со строчной латинской буквы (от a до z) или символа подчеркивания и продолжаются любой комбинацией латинских букв, цифр и символа подчеркивания. Те же правила распространяются и на имена методов.

В языке имеется небольшое множество зарезервированных слов, которые нельзя использовать в качестве имен переменных и методов.

Зарезервированные слова
__FILE__and defend inor selfunless
__LINE__begin defined?ensure moduleredo superuntil
BEGINbreak dofalse nextrescue thenwhen
ENDcase else for nilretry truewhile
aliasclass elsifif notreturn undefyield

Кроме локальных переменных Ruby поддерживает и другие их виды - глобальные переменные, переменные классов и экземпляров. Принадлежность к каждому из этих видов определяются символом, стоящим перед именем переменной (префиксом): символ $ задает глобальную переменную, @ - переменную экземпляра, @@ - переменную класса. Локальные переменные не имеют префикса. Имена констант и классов должны начинаться с прописной латинской буквы (A-Z) и, аналогично переменным, продолжаются любой комбинацией латинских букв, цифр и символа подчеркивания.

Локальная переменная создается динамически в момент, когда ей в процессе выполнения программы первый раз присваивается какое-то значение. Оператор присваивания имеет вид знака = (равно), например, a = 1; b = a; name = "Иван". Переменные могут использоваться во всех выражениях Ruby аналогично соответствующим объектам: 

a = "Привет всем!"
puts a

В Ruby переменные есть ссылки на объекты. Их следует трактовать как некие метки. Для того чтобы лучше понять эту концепцию проведем следующую аналогию: пусть у вас есть некоторая коробка (объект), вы берете наклейку (переменную), подписываете ее (даете имя переменной), после чего наклеиваете ее на коробку (объект). В Ruby переменные не имеют типа, так как они есть всего лишь ссылки на объекты произвольных типов. Проиллюстрируем сказанное следующим примером:

a = "one"
puts a
puts a.type
a = 23
puts a
puts a.type
Обратите внимание на метод type, возвращающий тип объекта. При первом использовании переменная a есть ссылка на объект класса String, затем мы присваиваем этой переменной другое значение (наклеиваем ту же этикетку на новый объект), после чего она становится ссылкой на экземпляр класса Fixnum.

Ruby поддерживает также и присваивание с операцией. Результат выполнения следующих двух операторов одинаковы: 

a+=12
a=a+12
Общая форма подобных операторов выглядит так:
выражение1 операция= выражение2
что соответствует оператору
выражение1 = выражение1 операция выражение2
Между знаком операции и символом равенства не должно быть пробела. Такой синтаксис допустим для следующих операций:
    +, -, *, /, %, **, &, |, ^, <<, >>, &&, |

Когда требуется присвоить значение нескольким переменным, можно использовать множественное присваивание

a, b, c = 1, 2, 3


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

a, b = b, a
Данный пример объясняет, почему эту форму оператора присваивания называют также "параллельным присваиванием".

Мы уже упоминали одну из замечательных возможностей Ruby - подстановку. Она позволяет выполнять разнообразные трюки со строкой, заключенной в двойные кавычки, например,

magic = 42
puts "Секретное число равно #{magic - 3}!!"
Когда Ruby находит конструкцию #{выражение} внутри строки, заключенной в двойные кавычки, то заменяет эту ее часть на результат вычисления выражения.


Пример
Дано трехзначное число. Напечатать число, получающееся при перестановке цифр десятков и единиц заданного числа.

number = 342
puts "Исходное число равно #{number}"
n1 = number/100                   # число сотен
n2 = (number/10)%10               # число десятков
n3 = number%10                    # число единиц
answer = n1*100 + n3*10 + n2
puts "Результат #{answer}"
(загрузить программу)

Иногда возникает необходимость указать, что тот или иной объект в программе является неизменяемым. Такие объекты называются константами. В Ruby имена констант, также как и имена классов, должны начинаться с заглавной буквы (есть определенная традиция задавать имена констант, состоящие из одних заглавных букв). Рассмотрим следующий фрагмент программы:

NUM = 234
p NUM      # 234
NUM = "qq" # warning: already initialized constant NUM 
p NUM      # "qq"  
Как видим, интерпретатор выдал предупреждение о том, что константа NUM уже была определена ранее. Тем не менее значение константы было изменено.


Задания

  1. Напишите программу, печатающую количество квадратов со стороной 130 мм, которое можно отрезать от прямоугольника со сторонами 543x130 мм.
  2. Напишите программу, которая по данному числу a, не используя никаких арифметических операций, кроме умножения, получает a8 за три операции.

Предыдущий раздел Уровень выше Следующий раздел