В этом посте мы обсудим управление потоком данных в Ruby.
- Управление потоком данных:
- if / elsif / else
- case
- until / unless?
- while / for
- Что означает true и false.
- Что такое
===
.
Итак, if, elsif — это, вероятно, структуры, с которыми многие из нас знакомы из других языков программирования.
Отличие в том, что в Ruby нет скобок или фигурных скобок в этом случае, и вы используете end
для закрытия блока управления потоком.
Так что если это просто оператор if
или оператор if
/ else
, у вас всегда будет end
в конце.
a = 5 # объявляем переменную
if a == 3
puts "a равняется 3"
elsif a == 5
puts "a равняется 5"
else
puts "a не равняется ни 3, ни 5"
end
# => a равняется 5
Также в Ruby есть интересное ключевое слово unless
. Unless это в когда что-то не совпадает с чем-то другим (“если только не”).
Итак, в этом случае a равняется 5. Мы пишем в коде “если только a не равняется 6, делай то что ты должен делать”, в этом случае вывод текста.
a = 5 # объявляем переменную
unless a == 6
puts "a не равняется 6"
end
# => a не равняется 6
Кроме того, есть цикл while
. В этом примере у нас переменная, которой присваивается значение 10. И пока a больше 9, продолжается выполнение содержимого цикла.
a = 10
while a > 9
puts a
a -= 1
# то же что и a = a - 1
end
# => 10
В этом случае вы вычитаете 1 из a, каждый раз, проходя через цикл, так что он будет выполняться только один раз, потому что второй раз a будет не больше девяти. Таким образом, единственный вывод из этого цикла будет равен 10.
Затем идет еще один специфический оператор Ruby, который является противоположностью while
, это until
.
В этом примере даем значение 9. До тех пор пока a станет больше или равно 10, продолжай выводить “9”. Так что цикл выполнится только один раз, потому что в следующем цикле значение будет равняться 10, поэтому он не будет выполняться.
a = 9
until a >= 10
puts a
a += 1
end
# => 9
Поток управления данными: измененная форма
- if, unless, while, until — в одной строке с выражением
# if в одной строке
a = 5
b = 0
puts "В одну строку" if a == 5 and b == 0
# => В одну строку
Читается почти как естественный английский. То же самое относится и к while:
# while в одной строке
times_2 = 2
times_2 *= 2 while times_2 < 100
puts times_2
# => ?
Можете догадаться какой ответ?
Если вы ответили 128, вы правы.
Что является true и что является false в Ruby?
- Объекты
false
иnil
являются false - Всё остальное является true!
puts "0 является true" if 0 # => 0 является true
puts "false является true?" if "false" # => false является true?
puts "не может быть - false равняется false" if false # => НИЧЕГО
puts "пустая строка является true" if "" # => пустая строка является true
puts "nil является true?" if "nil" # => nil является true?
puts "не может быть - nil является false" if nil # => НИЧЕГО
Тройной знак равенства
- Тройной знак равенства
===
- “Равно” по-своему
- Иногда речь идет о не совсем равном
Чаще всего вы будете видеть стандартный ==
, который использует большинство объектов. Но также есть интересная реализация в виде тройного знака равенства.
Тройной знак равенства в большинстве случаев просто делегируется двойному знаку равенства, поэтому он похож на его расширенную версию.
if /lan/ === "language"
puts "Тройной знак равенства"
end
# => Тройной знак равенства
if "language" === "language"
puts "тоже работает"
end
# => тоже работает
if Integer === 21
puts "21 является целым числом"
end
# => 21 является целым числом
Здесь “lan” является частью строки “language”, равны ли они на самом деле? Конечно нет. Но было бы здорово сказать, что это регулярное выражение соответствует строке, и это то, что делает тройной знак равенства.
Тройной знак равенства также работает если вы сравните строку саму с собой. В этом случае сработал бы и ==
.
В третьем случае значение “21” выглядит как целое число, поэтому ===
позволяет сравнить и это.
Выражения Case
- Две “особенности”:
- Похоже на серию выражений “if”
- Указывайте цель после
case
и условие после каждогоwhen
===
называется оператором сравнения case, потому что он используется именно в этом случае- Отсутствие “логики падения” (fall-through logic)
Заметка: если вы привыкли к стилю C, в котором есть логика падения в выражениях case, здесь это не так. В Ruby выполняется только один случай, который фактически соответствует, и никакие другие.
age = 21
case # первая особенность
when age >= 21
puts "Вы можете купить напиток"
when 1 == 0
puts "Написано пьяным программистом"
else
puts "Состояние по умолчанию"
end
# => Вы можете купить напиток
name = 'Fisher'
case name # вторая особенность
when /fish/i then puts "Есть что-то рыбное"
when 'Смит' then puts "Ваше имя Смит"
end
# => Есть что-то рыбное
Во втором примере у нас есть цель (name) и после каждого when у нас идет условие, которое сравнивается с этой целью.
Для сравнения здесь используется тройной знак равенства, то есть каждое условие сравнивает себя с целью при помощи этого свойства.
Циклы
Циклы существуют в Ruby, но они не используются часто.
for i in 0..2 # диапазон
puts i
# => 0
# => 1
# => 2
Циклы редко используются в Ruby, так как предпочтение отдается each
и times
.