В Ruby выражения важны почти так же, как предложения. Для программиста на С
это звучит знакомо, а для программиста на Pascal - откровенная нелепость. Но
Ruby ориентирован на выражения даже в большей степени, чем С.
Заодно в этом разделе мы остановимся на паре мелких вопросов, касающихся
регулярных выражений; считайте это небольшим бонусом.
• В Ruby любое присваивание возвращает то же значение, которое стоит в
правой части. Поэтому иногда мы можем немного сократить код, как показано
ниже, но будьте осторожны, имея дело с объектами! Не забывайте, что
это почти всегда ссылки.
х = у = z = О # Все переменные сейчас равны 0.
# Опасно! a, b и с ссылаются
# на ОДИН И ТОТ ЖЕ пустой массив.
а = b = с = []
х = 5
у = х += 2 # Сейчас х и у равны 7.
Напомним однако, что значения типа Fixnum и им подобные хранятся непосредственно,
а не как ссылки на объекты.
Многие управляющие конструкции возвращают значения, в частности if,
unless и case. Следующий код корректен; он показывает, что при принятии
решения ветви могут быть выражениями, а не полноценными предложениями.
а = 5
х = if а < 8 then 6 else 7 end # х равно 6.
y = i f a < 8 #у тоже равно 6;
6 # предложение if может располагаться
else # на одной строке
7 # или на нескольких,
end
# unless тоже работает; z присваивается значение 4.
z = unless х == у then 3 else 4 end
t=case a #t получает
when 0..3 # значение
"low" # medium
when 4..6
"medium"
else
"high"
end
Здесь мы сделали такие отступы, будто case является присваиванием. Мы I
воспринимаем такую запись спокойно, хотя вам она может не понравиться.
•Отметим, что циклы while и until, напротив, не возвращают никаких по-|
лезных значений; обычно их значением является nil:
i = О
х = while
puts i+=
end
•Тернарный оператор можно использовать как в предложениях, так и в выражениях.
В силу синтаксических причин (или ограничений анализатора)!
скобки здесь обязательны:
6
= 5 ? О : 1 # У равно 1.
? puts("Привет") : puts("Пока") # Печатается:
х
у = X
х == 5 "Пока"
•Предложение return в конце метода можно опускать. Метод всегда возвращает
значение последнего вычисленного выражения, в каком бы месте Эт
вычисление ни происходило.
•Когда итератор вызывается с блоком, последнее выражение, вычисленное!
в блоке, возвращается в качестве значения блока. Если при этом в теле итератора есть предложение х = yield, то х будет присвоено это значение.
•Регулярные выражения. Напомним, что после регулярного выражения мож- рНые с к обки в i но написать модификатор многострочности /т, и в этом случае точка (.) будет
сопоставляться с символом новой строки.
•Регулярные выражения. Опасайтесь соответствий нулевой длины. Если все элементы регулярного выражения необязательны, то такому образцу будет соответствовать «ничто», причем соответствие всегда будет найдено
в начале строки. Это типичная ошибка, особенно часто ее допускают
новички.
