Ruby — один из самых популярных языков, используемых в сети. Мы начали новую серию скринкастов здесь, на Nettuts +, которая познакомит вас с Ruby, а также с отличными фреймворками и инструментами, которые сопровождают разработку на Ruby. В этой главе мы рассмотрим, как работают условные операторы и циклы в Ruby.
Наверстать
- Часть 1. Установка Ruby и начало работы
- Часть 2. Переменные, типы данных и файлы
- Часть 3: Работа с классами
- Часть 4: условные выражения и циклы
Посмотреть скринкаст
Условие № 1: если заявление
Оператор if является одним из первых типов ветвления, которые вы изучаете при программировании. Вы можете догадаться, что это значит: если это правда, сделайте одну вещь; если это не так, сделай что-нибудь еще. В Ruby это довольно легко написать:
01
02
03
04
05
06
07
08
09
10
11
|
name = «Andrew»
if name == «Andrew»
puts «Hello Andrew»
end
if name == «Andrew»
puts «Hello Andrew»
else
puts «Hello someone else»
end</code>
|
После ключевого слова if
укажите свой условный оператор. После этого приходит код для выполнения, если условие возвращает true. Вы закрываете оператор с помощью ключевого слова end
. Если вы хотите, вы можете сжать там оператор else
, который будет предсказуемо выполняться, если условие ложно.
ELSIF
Нетрудно проверить наличие нескольких условий. Просто поместите столько утверждений elsif
сколько вы хотите, между утверждениями if
и else
. Да, это elsif
, брак else
и if
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
order = { :size => «medium» }
def make_medium_cofee
puts «making medium statement»
end
#assume other functions
if order[:size] == «small»
make_small_coffee;
elsif order[:size] == «medium»
make_medium_coffee;
elsif order[:size] == «large»
make_large_coffee;
else
make_coffee;
end</code>
|
Как я уже упоминал, вы можете иметь столько условий elsif
и соответствующих им блоков кода, сколько захотите.
Заявления и выражения
Большинство языков программирования делают различие между утверждениями и выражениями. Операторы — это кодовая конструкция, которая не оценивается до определенного значения. Выражение является конструкцией кода и возвращает значение. Например, вызов функции является выражением, потому что он возвращает значение. Однако оператор if — это как раз оператор, потому что он не возвращает значение. Это означает, что вы не можете сделать это в своем JavaScript:
1
2
3
4
5
|
message = if (someTruthyValue) {
«this is true»;
} else {
«this is false»;
}</code>
|
Очевидно, что вы не можете сделать это, потому что оператор if не возвращает значение, которое вы можете присвоить message
.
Однако вы можете сделать это с Ruby, потому что операторы на самом деле являются выражениями, то есть они возвращают значение. Таким образом, мы можем сделать это
1
2
3
4
5
6
7
|
message = if order[:size] == «small»
«making a small»
elsif order[:size] == «medium»
«making a medium»
else
«making coffee»
end</code>
|
Какой бы блок кода ни выполнялся, он станет значением message
.
Если в качестве модификатора
Если у вас нет предложений elsif
или else
, а ваш оператор if содержит только одну строку, вы можете использовать его как модификатор «нормальной» строки.
1
|
puts «making coffee» if customer.would_like_coffee?</code>
|
Условие № 2: если не указано
В большинстве языков программирования мы хотим отменить возврат условного выражения, мы должны отрицать его, обычно с помощью оператора bang ( !
).
1
2
3
4
5
|
engine_on = true
if !engine_on # meaning «if not engine_on»
puts «servicing engine» #should not be put, because «not engine_on» is false
end</code>
|
Тем не менее, в Ruby есть действительно хороший оператор unless
что, который мешает нам делать это, и в то же время дает нам гораздо более читаемый код:
1
2
3
|
unless engine_on # «unless engine_on» is better than «if not engine_on»
«servicing engine»
end</code>
|
Так же, как if
, вы можете использовать, unless
в качестве модификатора:
1
|
puts «servicing engine» unless engine_on</code>
|
Условие № 3: Случай / Когда Заявление
Если у вас есть много вариантов для работы, использование if/elsif/else
может быть несколько многословным. Попробуйте заявление о ситуации.
01
02
03
04
05
06
07
08
09
10
|
hour = 15
case
when hour < 12
puts «Good Morning»
when hour > 12 && hour < 17
puts «Good Afternoon»
else
puts «Good Evening»
end</code>
|
Это что-то вроде сортировки switch/case
в JavaScript (или других языках), за исключением того, что нет ни одной переменной, которую вы оцениваете. В ключевые слова case/end
вы можете поместить столько операторов когда вы хотите. Затем следует условное выражение, а затем идут строки кода. Как и оператор if, оператор case на самом деле является выражением, поэтому вы можете назначить его выражению и получить возвращаемое значение.
01
02
03
04
05
06
07
08
09
10
11
12
|
hour = 15
message = case
when hour < 12
«Good Morning»
when hour > 12 && hour < 17
«Good Afternoon»
else
«Good Evening»
end
puts message</code>
|
Разбивая выражения
Если вы знакомы с JavaScript, вы будете знать, что блоки кода в операторе if заключены в фигурные скобки. Мы не делаем этого в Ruby, поэтому может показаться, что Ruby зависит от пробелов. Ничто не может быть дальше от истины (возьми, питонисты :)).
Если мы хотим написать ваши высказывания в виде однострочников, нужно разделить разные части заявлений … но как? Ну, вы можете использовать точки с запятой:
1
2
|
if name == «Andrew»;
else;
|
Если вам не нравится внешний вид этого (что мне не нравится), тогда вы можете поместить ключевое слово между условными выражениями и строкой кода.
1
|
if name == «Andrew» then sode_code;
|
Это также работает для заявления случая.
1
2
3
4
|
case
when x > 20;
when x < 20 then puts «<20»
end</code>
|
Цикл № 1: Пока Цикл
Итак, это условные утверждения (я имею в виду выражения). Как насчет петель? Давайте сначала посмотрим на циклы while.
Цикл while будет выполняться до тех пор, пока указанное условие не станет ложным:
1
2
3
4
5
6
7
|
arr = [«John», «George», «Paul», «Ringo»]
i = 0
while arr[i]
puts arr[i]
i += 1
end</code>
|
Здесь мы перебираем массив; когда arr[i]
возвращает false (это означает, что в массиве не осталось элементов), цикл останавливается. Внутри цикла мы распечатываем текущий элемент в массиве, а они добавляют его в нашу переменную приращения.
Вы также можете использовать в качестве модификатора
1
2
3
4
|
arr = [«John», «George», «Paul», «Ringo»]
i = -1
puts arr[i += 1] while arr[i]</code>
|
Цикл № 2: до цикла
Так же, как unless
является противоположностью, if
, until
является противоположностью while
. Это будет продолжаться до тех пор, пока условие не станет истинным:
1
2
3
4
5
6
|
days_left = 7;
until days_left == 0
puts «there are still #{days_left} in the week»
days_left -= 1
end</code>
|
И, конечно же, это модификатор тоже.
1
2
3
|
days_left = 8
puts «there are still #{days_left -= 1} in the week» until days_left == 1</code>
|
Петля № 3: для петли
Да, у Руби есть цикл for. Нет, это не похоже на цикл for в других языках. Он действует как цикл foreach для зацикливания значений в массиве или хэше:
1
2
3
4
5
|
arr = [«John», «George», «Paul», «Ringo»]
for item in arr
puts item
end</code>
|
Если вы зацикливаетесь на хэше, вы можете использовать два имени переменных, одно для ключа и одно для значения:
1
2
3
4
5
|
joe = { :name => «Joe», :age => 30, :job => «plumber» }
for key, val in joe
puts «#{key} is #{val}»
end</code>
|
Это оно!
Надеюсь, вам понравился наш сериал Ruby for Newbies Screencast. Если вы хотите что-то увидеть, дайте мне знать в комментариях! (И если вы не смотрите видео, вы должны это сделать. В конце каждого из них есть бонус только за скринкаст.)