В следующем предложении мы видим пример множественного присваивания. Метод split
В следующем предложении if
end
. Хотя в данном случае это не нужно. Мы могли бы включить перед end
ветвь else
. Ключевое слово then
необязательно; в этой книге мы стараемся не употреблять его.Метод to_f
temp
, в которой раньше хранилась строка.Предложение case
С
, F
или какое-то другое значение в качестве шкалы. В первых двух случаях выполняется вычисление, в третьем мы печатаем сообщение об ошибке и выходим.Кстати, предложение case
В самом вычислении нет ничего интересного. Но обратите внимание, что переменные с и f
case
. В Ruby нет никаких объявлений — переменная начинает существовать только в результате присваивания. А это означает, что после выхода из case
лишь одна из переменных elif
будет иметь действительное значение.Мы воспользовались этим фактом, чтобы понять, какая ветвь исполнялась, и в зависимости от этого вывести то или другое сообщение. Сравнение f
nil
позволяет узнать, есть ли у переменной осмысленное значение. Этот прием применен только для демонстрации возможности: ясно, что при желании можно было бы поместить печать прямо внутрь предложения case
.Внимательный читатель заметит, что мы пользовались только «локальными» переменными. Это может показаться странным, так как, на первый взгляд, их областью видимости является вся программа. На самом деле они локальны относительно верхнего уровня программы. Глобальными они кажутся лишь потому, что в этой простой программе нет контекстов более низкого уровня. Но если бы мы объявили какие-нибудь классы или методы, то в них переменные верхнего уровня были бы не видны.
1.2.6. Циклы и ветвление
Потратим немного времени на изучение управляющих конструкций. Мы уже видели простое предложение if
if
. Существуют также парные структуры, в которых используется ключевое слово unless
(в них также может присутствовать необязательная ветвь else
), а равно применяемые в выражениях формы if
и unless
. Все они сведены в таблицу 1.1.Таблица 1.1. Условные предложения
Формы с if | Формы с unless |
---|---|
if x < 5 then statement1 end | unless x >= 5 then statement1 end |
if x < 5 then statement1 else statement2 end | unless x < 5 then statement2 else statement1 end |
statement1 if y == 3 | statement1 unless y != 3 |
x = if a>0 then b else c end | x = unless a<=0 then с else b end |
Здесь формы с ключевыми словами if
unless
, расположенные в одной строке, выполняют в точности одинаковые функции. Обратите внимание, что слово then
можно опускать во всех случаях, кроме последнего (предназначенного для использования в выражениях). Также заметьте, что в модификаторах (третья строка) ветви else
быть не может.Предложение case
case
эквивалентны оператору ветвящегося равенства (===
), поведение которого зависит от объекта. Рассмотрим пример:case "Это строка символов."
when "одно значение"
puts "Ветвь 1"
when "другое значение"
puts "Ветвь 2"
when /симв/
puts "Ветвь 3"
else
puts "Ветвь 4"
end
Этот код напечатает Ветвь 3
"одно значение"
и "другое значение"
. Эта проверка завершается неудачно, поэтому мы переходим к третьей ветви. Там находится образец, с которым сопоставляется выражение. Поскольку оно соответствует образцу, то выполняется предложение print
. В ветви else
обрабатывается случай, когда ни одна из предшествующих проверок не прошла.