Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

212.0 градусов F

Введите температуру и шкалу (С or F):

92 G Необходимо задать С или F.

Введите температуру и шкалу (С or F): junk F

junk недопустимое число.

Теперь рассмотрим, как эта программа работает. Все начинается с предложения

print
, которое есть не что иное, как вызов метода
print
из модуля
Kernel
. Данный метод выполняет печать на стандартный вывод. Это самый простой способ оставить курсор в конце строки.

Далее мы вызываем метод

gets
(прочитать строку из стандартного ввода) и присваиваем полученное значение переменной
str
. Для удаления хвостового символа новой строки вызывается метод
chomp!
.

Обратите внимание, что

print
и
gets
, которые выглядят как «свободные» функции, на самом деле являются методами класса
Object
(который, вероятно, наследует
Kernel
). Точно так же
chomp!
— метод, вызываемый от имени объекта
str
. При вызовах методов в Ruby обычно можно опускать скобки:
print "foo"
и
print("foo")
— одно и то же.

В переменной

str
хранится символьная строка, но могли бы храниться данные любого другого типа. В Ruby данные имеют тип, а переменные - нет. Переменная начинает существовать, как только интерпретатор распознает присваивание ей; никаких предварительных объявлений не существует.

Метод

exit
завершает программу. В той же строке мы видим управляющую конструкцию, которая называется «модификатор
if
». Он аналогичен предложению
if
, существующему в большинстве языков, только располагается после действия. Для модификатора
if
нельзя задать ветвь
else
, и он не требует закрытия. Что касается условия, мы проверяем две вещи: имеет ли переменная
str
значение (то есть не равна
nil
) и не является ли она пустой строкой. Если встретится конец файла, то будет истинно первое условие; если же пользователь нажмет клавишу Enter, не введя никаких данных, — второе.

Это предложение можно было бы записать и по-другому:

exit if not str or not str[0]

Эти проверки работают потому, что переменная может иметь значение

nil
, а
nil
в Ruby в логическом контексте вычисляется как «ложно». На самом деле как «ложно» вычисляются
nil
и
false
, а все остальное — как «истинно». Это означает, кстати, что пустая строка
""
и число 0 — не «ложно».

В следующем предложении над строкой выполняется операция

chomp!
(для удаления хвостового символа новой строки). Восклицательный знак в конце предупреждает, что операция изменяет значение самой строки, а не возвращает новую. Восклицательный знак применяется во многих подобных ситуациях как напоминание программисту о том, что у метода есть побочное действие или что он более «опасен», чем аналогичный метод без восклицательного знака. Так, метод
chomp
возвращает такой же результат, но не модифицирует значение строки, для которой вызван.

В следующем предложении мы видим пример множественного присваивания. Метод

split
разбивает строку на куски по пробелам и возвращает массив. Двум переменным в левой части оператора присваиваются значения первых двух элементов массива в правой части.

В следующем предложении

if
с помощью простого регулярного выражения выясняется, введено ли допустимое число. Если строка не соответствует образцу, который состоит из необязательного знака «минус» и одной или более цифр, то число считается недопустимым и программа завершается. Отметим, что предложение if оканчивается ключевым словом
end
. Хотя в данном случае это не нужно. Мы могли бы включить перед
end
ветвь
else
. Ключевое слово
then
необязательно; в этой книге мы стараемся не употреблять его.

Метод

to_f
преобразует строку в число с плавающей точкой. Это число записывается в ту же переменную
temp
, в которой раньше хранилась строка.

Предложение

case
выбирает одну из трех ветвей: пользователь указал
С
,
F
или какое-то другое значение в качестве шкалы. В первых двух случаях выполняется вычисление, в третьем мы печатаем сообщение об ошибке и выходим.

Кстати, предложение

case
в Ruby позволяет гораздо больше, чем показано в примере. Нет никаких ограничений на типы данных, а все выражения могут быть произвольно сложными, в том числе диапазонами или регулярными выражениями.

В самом вычислении нет ничего интересного. Но обратите внимание, что переменные с и

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
Поделиться:
Популярные книги

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Старый, но крепкий 7

Крынов Макс
7. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 7

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Воин-Врач

Дмитриев Олег
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
Воин-Врач