Статьи

Рубин для новичков: условные выражения и циклы

Ruby — один из самых популярных языков, используемых в сети. Мы начали новую серию скринкастов здесь, на Nettuts +, которая познакомит вас с Ruby, а также с отличными фреймворками и инструментами, которые сопровождают разработку на Ruby. В этой главе мы рассмотрим, как работают условные операторы и циклы в Ruby.




Оператор 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 сколько вы хотите, между утверждениями 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>

В большинстве языков программирования мы хотим отменить возврат условного выражения, мы должны отрицать его, обычно с помощью оператора 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>

Если у вас есть много вариантов для работы, использование 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>

Итак, это условные утверждения (я имею в виду выражения). Как насчет петель? Давайте сначала посмотрим на циклы 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>

Так же, как 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>

Да, у Руби есть цикл 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. Если вы хотите что-то увидеть, дайте мне знать в комментариях! (И если вы не смотрите видео, вы должны это сделать. В конце каждого из них есть бонус только за скринкаст.)