• Многие управляющие конструкции возвращают значения, в частности if
, unless
и case
. Следующий код корректен; он показывает, что при принятии решения ветви могут быть выражениями, а не полноценными предложениями.
а = 5
x = if а < 8 then 6 else 7 end # x равно 6.
y= if a<8 # y тоже равно 6;
6 # предложение if может располагаться
else # на одной строке
7 # или на нескольких.
end
# unless тоже работает; z присваивается значение 4.
z = unless x == y then 3 else 4 end
t = case a # t получает
when 0..3 # значение
"low" # medium,
when 4..6
"medium"
else
"high"
end
Здесь мы сделали такие отступы, будто case
является присваиванием. Мы воспринимаем такую запись спокойно, хотя вам она может не понравиться.
• Отметим, что циклы while
и until
, напротив, не возвращают никаких полезных значений; обычно их значением является nil
:
i = 0
x = while (i < 5) # x равно nil.
puts i+=1
end
• Тернарный оператор можно использовать как в предложениях, так и в выражениях. В силу синтаксических причин (или ограничений анализатора) скобки здесь обязательны:
x = 6
y = x == 5 ? 0 : 1 #y равно 1.
x == 5 ? puts("Привет") : puts("Пока") # Печатается: "Пока"
• Предложение return
в конце метода можно опускать. Метод всегда возвращает значение последнего вычисленного выражения, в каком бы месте это вычисление ни происходило.
• Когда итератор вызывается с блоком, последнее выражение, вычисленное в блоке, возвращается в качестве значения блока. Если при этом в теле итератора есть предложение x = yield
, то x
будет присвоено это значение.
• Регулярные выражения . Напомним, что после регулярного выражения можно написать модификатор многострочности /m
, и в этом случае точка ( .
) будет сопоставляться с символом новой строки.
• Регулярные выражения. Опасайтесь соответствий нулевой длины. Если все элементы регулярного выражения необязательны, то такому образцу будет соответствовать «ничто», причем соответствие всегда будет найдено в начале строки. Это типичная ошибка, особенно часто ее допускают новички.
Заново начинать учить английский для освоения Ruby необязательно. Но нужно знать кое-какие жаргонные выражения, обычные в сообществе. Некоторые из них имеют другой смысл, чем принято в компьютерном мире. Им и посвящен настоящий раздел.
В Ruby термин «атрибут» носит неофициальный характер. Можно считать, что атрибут — это переменная экземпляра, которая раскрывается внешнему миру с помощью одного из методов семейства attr
. Но тут нет полной определенности: могут существовать методы foo
и foo=
, не соответствующие переменной @foo
, как можно было бы ожидать. И, конечно, не все переменные экземпляра считаются атрибутами. Как обычно, нужно придерживаться здравого смысла.
Атрибуты в Ruby можно подразделить на методы чтения (reader) и установки (writer). Метод доступа , или акцессор (accessor), является одновременно методом чтения и установки. Это согласуется с названием метода attr_accessor
, но противоречит принятой в других сообществах семантике, согласно которой акцессор дает доступ только для чтения.
Оператор ===
имеется только в Ruby (насколько мне известно). Обыкновенно он называется оператором ветвящегося равенства (case equality operator), поскольку неявно используется в предложениях case
. Но это название, как я уже говорил, не вполне точно, потому что речь идет не только о «равенстве». В данной книге я часто употребляю термин «оператор отношения» (relationship operator). Изобрел его не я, но проследить происхождение мне не удалось, к тому же он употребляется нечасто. Жаргонное название — «оператор тройного равенства» (threequal operator) или просто «три равно».
Оператор <=>
, наверное, лучше всего называть оператором сравнения. На жаргоне его называют космическим оператором (spaceship operator), поскольку он напоминает летающую тарелку — так ее изображали в старых видеоиграх.
Термин «поэтический режим» (poetry mode) подчеркивает, что можно опускать ненужные знаки препинания и лексемы (насмешливый намек на отношение поэтов к пунктуации на протяжении последних шестидесяти лет). Поэтический режим также часто означает «опускание скобок при вызове метода».
some_method(1, 2, 3) # Избыточные скобки.
Читать дальше
Конец ознакомительного отрывка
Купить книгу