• Префикс @@
применяется для переменных класса (то есть ассоциированных с классом в целом, а не с отдельным экземпляром).
• loop
— не ключевое слово. Это метод модуля Kernel
, а не управляющая конструкция.
• Кому-то синтаксис unless-else
может показаться интуитивно неочевидным. Поскольку unless
— противоположность if
, то ветвь else
выполняется, когда условие истинно.
• Простой тип Fixnum
передается как непосредственное значение и, стало быть, не может быть изменен внутри метода. То же относится к значениям true
, false
и nil
.
• Не путайте операторы &&
и ||
с операторами &
и |
. Те и другие используются в языке С; первые два предназначены для логических операций, последние два — для поразрядных.
• Операторы and
и or
имеют более низкий приоритет, чем &&
и ||
. Взгляните на следующий фрагмент:
а = true
b = false
с = true
d = true
a1 = a && b or с && d # Операции && выполняются первыми.
a2 = a && (b or с) && d # Операция or выполняется первой.
puts a1 # Печатается false
puts a2 # Печатается true
• He забывайте, что «оператор» присваивания имеет более высокий приоритет, чем операторы and
и or!
(это относится и к составным операторам присваивания: +=
, -=
и пр.). Например, код x = y or z
выглядит как обычное предложение присваивания, но на самом деле это обособленное выражение (эквивалент (x=у) or z
). Вероятно, программист имел в виду следующее: x = (y or z)
.
y = false
z = true
x = y or z # Оператор = выполняется РАНЬШЕ or!
puts x # Печатается false
(x = y) or z # Строка 5: то же, что и выше.
puts x # Печатается false
x = (y or z) # Оператор or вычисляется сначала.
puts x # Печатается true
• Не путайте атрибуты объектов с локальными переменными. Если вы привыкли к C++ или Java, можете забыть об этом! Переменная @my_var
в контексте класса — это переменная экземпляра (или атрибут), но my_var
в том же контексте — локальная переменная.
• Во многих языках, и в Ruby в том числе, есть цикл for
. Рано или поздно возникает вопрос, можно ли модифицировать индексную переменную. В некоторых языках эту управляющую переменную запрещено изменять вовсе (выводится предупреждение либо сообщение об ошибке на этапе компиляции или выполнения); в других это допустимо, хотя и приводит к изменению поведения цикла. В Ruby принят третий подход. Переменная, управляющая циклом for
, считается обычной переменной, которую можно изменять в любой момент, но это изменение не оказывает влияния на поведение цикла! Цикл for присваивает этой переменной последовательные значения, что бы с ней ни происходило внутри тела цикла. Например, следующий цикл будет выполнен ровно 10 раз и напечатает значения от 1 до 10:
for var in 1..10
puts "var = #{var}"
if var > 5
var = var + 2
end
end
• Имена переменных не всегда легко «на глаз» отличить от имен методов. Как решает этот вопрос анализатор? Правило такое: если анализатор видит, что идентификатору присваивается значение до его использования, то он считается переменной; в противном случае это имя метода. (Отметим, что операция присваивания может и не выполняться: достаточно того, что интерпретатор ее видел.)
1.5.3. Предложение case в Ruby
Во всех современных языках есть та или иная форма многопутевого ветвления. В C/C++ и Java это предложение switch
, а в Pascal — предложение case
. Служат они одной и той же цели и функционируют примерно одинаково.
Предложение case
в Ruby похоже, но при ближайшем рассмотрении оказывается настолько уникальным, что варианты ветвления, принятые в С и в Pascal, кажутся близкими родственниками. Точного аналога предложению case
в Ruby нет ни в каком другом знакомом мне языке, поэтому оно заслуживает особого внимания.
Выше мы уже рассматривали синтаксис этого предложения, а теперь сосредоточимся на его семантике.
• Для начала рассмотрим тривиальный пример. Выражение expression
сравнивается со значением value
, и, если они совпадают, выполняется некоторое действие. Ничего удивительного.
case expression
when value
некоторое действие
end
В Ruby для этой цели есть специальный оператор ===
(называется оператором отношения ). Иногда его еще называют (не совсем правильно) оператором ветвящегося равенства. Неправильность в том, что он не всегда относится именно к проверке на равенство.
Читать дальше
Конец ознакомительного отрывка
Купить книгу