Выбрать главу

Ничего сложного. Подобным же образом мы можем выяснить, что объект больше или равен другому (или меньше или равен) с помощью методов >= и <=.

puts 5 >= 5 puts 5 <= 4

true

false

И наконец, мы можем выяснить, равны ли два объекта или нет, используя == (что обозначает «они равны?») и != (что обозначает «они различны?»). Важно не путать = с ==. = используется, чтобы заставить переменную указывать на объект (присваивание), а == используется для ответа на вопрос: «Эти два объекта равны?»

puts 1 == 1 puts 2 != 1

true

true

Конечно, мы также можем сравнивать строки. Когда сравниваются строки, они сопоставляются в лексикографическом порядке, что обычно означает словарную упорядоченность. cat в словаре идёт перед dog, поэтому:

puts 'cat' < 'dog'

true

Однако, здесь таится ловушка: обычно в компьютерах устроено так, что устанавливается такой порядок букв, в котором заглавные располагаются перед строчными буквами. (Так хранятся буквы в шрифтах, например: сначала все заглавные буквы, а за ними – строчные.) Это означает, что компьютер будет думать, что ' Zoo' располагается перед ' ant', так что, если вы хотите выяснить, какое слово идёт первым в настоящем словаре, обязательно примените метод downcase (или upcase или capitalize) к обоим словам прежде, чем вы попытаетесь их сравнить.

Последнее замечание перед «Ветвлением»: методы сравнения не возвращают нам строки 'true' и 'false'; они возвращают нам специальные объекты true и false.

(Конечно, true.to__ s вернёт нам ' true', именно поэтому puts напечатал ' true'.)

true и false всегда используются для…

Ветвления

Ветвление – это простое, но очень мощное понятие. Фактически, оно настолько простое, что, ей-Богу, мне совсем даже и не нужно объяснять его; я просто покажу его вам:

puts 'Привет, как Вас зовут?' name = gets.chomp puts 'Привет, ' + name + '.' if name == 'Chris'

puts 'Какое милое имя!' end

Привет, как Вас зовут?

Chris

Привет, Chris.

Какое милое имя!

Но если мы введём другое имя…

Привет, как Вас зовут?

Chewbacca Привет, Chewbacca.

Вот это и есть ветвление. Если то, что находится после if, имеет значение true, мы выполняем код между if и end. Если то, что находится после if, имеет значение false, то не выполняем. Ясно и просто.

Я выделил отступом код между if и end просто потому, что, полагаю, таким образом легче отслеживать ветвление. Почти все программисты делают так, независимо от того, на каком языке они программируют. В этом простом примере может показаться, что от этого не слишком много пользы, но когда программа становится более сложной, это существенно меняет дело.

Часто нам бы хотелось, чтобы программа выполняла что-то, если выражение равно true, и нечто другое, если оно равно false. Для этого имеется else:

puts 'Я – предсказатель судьбы. Скажите мне своё имя:' name = gets.chomp if name == 'Chris'

puts 'Я предвижу у Вас в будущем великие дела.' else

puts 'Ваше будущее… О Боже! Посмотрите-ка на часы!' puts 'На самом деле мне пора уходить, извините!' end

Я предсказатель будущего. Скажите мне своё имя:

Chris

Я предвижу у Вас в будущем великие дела.

А теперь давайте попробуем другое имя…

Я предсказатель будущего. Скажите мне своё имя:

Ringo

Ваше будущее… О Боже! Посмотрите-ка на часы!

На самом деле мне пора уходить, извините!

Ветвление – это как будто мы подошли к развилке в коде: мы выберем дорожку к людям, чьё имя – Крис (name == ' Chris ' ), или же (else) мы выберем другой путь.

И совсем как ветви на дереве, у вас могут быть ветвления, которые сами содержат ветвления:

puts 'Здравствуйте и добро пожаловать в 7-й класс на урок английского.' puts 'Меня зовут миссис Габбард. А тебя зовут…?' name = gets.chomp

if name == name.capitalize

puts 'Садись, пожалуйста, ' + name + '.'

else

puts name + '? Ты имел в виду: ' + name.

capitalize + '

, не так ли?'

puts 'Ты что, даже не знаешь, как пишется

твоё имя??'

reply = gets.chomp

if reply == 'да'

puts 'Хммм! Ну хорошо, садись!'

else

puts 'УБИРАЙСЯ ВОН!!'

end

end

Здравствуйте и добро пожаловать в 7-й класс на урок английского.

Меня зовут миссис Габбард. А тебя зовут…?

chris

chris? Ты имел в виду: Chris, не так ли?

Ты что, даже не знаешь, как пишется твоё имя??

да

Хммм! Ну хорошо, садись!

Прекрасно, напишу его с заглавной буквы…

Здравствуйте и добро пожаловать в 7-й класс на урок английского.

Меня зовут миссис Габбард. А тебя зовут…?

Chris

Садись, пожалуйста, Chris.

Иногда можно запутаться, пытаясь «вычислить», куда же ведут все эти if–ы, else–ы и end–ы. Я делаю так: пишу end сразу же, когда напишу if. Так, когда я писал приведённую выше программу, сначала она выглядела вот так:

puts 'Здравствуйте и добро пожаловать в 7-й класс на урок английского.' puts 'Меня зовут миссис Габбард. А тебя зовут…?' name = gets.chomp

if name == name.capitalize

else

end

Затем я вставил комментарии – те вещи в коде, которые компьютер проигнорирует:

puts 'Здравствуйте и добро пожаловать в 7-й класс на урок английского.'

puts 'Меня зовут миссис Габбард. А тебя зовут…?'

name = gets.chomp

if name == name.capitalize

# Она говорит вежливо. else

# Она постепенно свирепеет. end

Всё, что стоит после знака #, считается комментарием (конечно, если только он не находится внутри строки). После этого я заменил комментарии работающим кодом. Некоторым нравится оставлять комментарии; лично я думаю, что хорошо написанный код обычно говорит сам за себя. Раньше я применял больше комментариев, но чем более «бегло» я пишу на Ruby, тем меньше я их использую. На самом деле я нахожу их в большинстве случаев отвлекающими внимание. Но это каждый выбирает для себя сам; и у вас сложится свой собственный (обычно развивающийся) стиль. И вот, мой следующий шаг выглядел так:

puts 'Здравствуйте и добро пожаловать в 7-й класс на урок английского.'

puts 'Меня зовут миссис Габбард. А тебя зовут…?'

name = gets.chomp

if name == name.capitalize

puts 'Садись, пожалуйста, ' + name + '.' else

puts name + '? Ты имел в виду: ' + name.capitalize + ', не так ли?' puts 'Ты что, даже не знаешь, как пишется твоё имя??' reply = gets.chomp

if reply == 'да' else end end

Снова я написал if, else и end одновременно. Это на самом деле помогает мне отслеживать, «где я нахожусь» в тексте программы. К тому же от этого задача кажется немного легче, поскольку я могу сфокусироваться на небольшой части программы – на вставке кода между if и else. Ести и другое преимущество от того, что я поступаю именно так. Оно состоит в том, что компьютер может понять программу на любом этапе разработки. Каждая из незаконченных версий программы, которые я показывал вам, будет выполняться. Они не были закончены, но это были работающие программы. Таким образом, я мог проверять её по ходу её написания, что помогало увидеть, как обстоят дела, и где она всё ещё нуждалась в доработке. Когда она прошла все проверки, я и выяснил, что я её закончил!