Архив метки: Flow of control

Главная / Flow of control
1 Пост

В этом посте мы обсудим управление потоком данных в 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

  • Две «особенности»:
    1. Похоже на серию выражений «if»
    2. Указывайте цель после 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.