Pull to refresh

Покорим Ruby вместе! Капля третья

Reading time 4 min
Views 27K
Капаем дальше. В третьей капле (капля первая, капля вторая) мы познакомимся с числовыми переменными и узнаем о принципах ООП.

Числа и Выражения


В программировании выражением (expression) называется комбинация чисел, операторов и переменных, которая, будучи понята компьютером, дает результат в какой-либо форме. Вот несколько примеров:

8
2 + 3
"a" + "b" + "c"
100 - 5 * (2 - 1)
x + y


Рассмотрим и разберем простой код:

x = 5
y = x * 20
x += y
puts x


Придаём переменной x значение 5, для y устанавливаем значение x * 20 (100). Затем прибавляем y к x и выводим результат. Все передельно ясно, единственная заминка может возникнуть на третьей строке. Казалось бы адекватнее написать x = x + y, однако это — кусочек сахара Ruby. Также можем использовать x *= y и x /=, а x += 1 увеличит переменную на единицу.

Операторы сравнения и Условия

Еще код:

age = 22
puts "Sovsem Molodoi!" if age < 25


Компьютер не только выполняет заданные операции (иначе это был бы просто калькулятор), он использует логику для определения направления работы. Результат исполнения кода предсказуем. Разберем вторую строку. Прежде всего обратим внимание на age < 25 — известные всем «больше/меньше» (а также ==, >=, <=, <=>, !=) работают и в Руби. Дальше видим знакомое из других языков условие: if. А где же then, end? Еще один сахарок Руби, на самом деле вторая строка полностью аналогична коду:

if age < 25 then
puts "Sovsem Molodoi!"
end


Условия можно комбинировать. Чтобы получить противоположный эффект можно использовать слово unless:

age = 24
puts "You're NOT a teenager" unless age > 12 && age < 20


Код понятен. Идем дальше.

Итераторы

Вот что ожидает нас здесь:

4.times do puts "Ruby" end

Давайте попробуем запустить код — результатом будет четырёхкратное выполнение puts. Анализируем. В первую очередь берётся число 4, затем для него вызывается метод times, применимый ко всем числам в Руби (метод? что такое метод? это действие — об этом поговорим позже). Вместо того, чтобы передавать в метод данные, мы передаём ему код, находящийся между do и end. Метод times затем 4 раза выполняет этот самый код. Как всегда Руби хочет, чтобы нам было удобнее писать программки, и поэтому дает еще одно послабление. Полностью аналогичный код, без do и end:

4.times { puts "Ruby" }

В Руби (да и в других ЯП тоже) одним из механизмов создания циклов является итератор — это некий объект, который позволяет перебирать все элементы какого-либо набора. В нашем случае он задает цикл, или итерирует, в четыре повтора. Посмотрим другие итераторы, применимые к числам в Руби:

1.upto(5) { ...код цикла... }
10.downto(5) { ...код цикла... }
0.step(50, 5) { ...код цикла... }


Думаю, назначение каждого из них понятно. Снова код:

1.upto(5) { |number| puts number }

В результате программа «посчитает до пяти» — мы передали состояние итерации в код. В начале циклируемого кода число «от 1 до 5» отправляется в переменную number.

Плавающая точка

Наверняка вы заметили, что во всех написанных ранее программах нам не приходилось объявлять переменные, определять их тип — Руби делает это за нас (продолжаем лизать сахар). Попробуем разделить: puts 10 / 3. Результат — 3. Так как входящие числа целые, то и результат остался целым. Руби хотел помочь, но у него не получилось. Давайте подскажем ему: puts 10.0 / 3.0. Решение оказалось простым!

Иногда мы оказываемся в такой ситуации, что не можем контролировать входящие числа, однако и тут есть решение:

x = 10
y = 3
puts x.to_f / y.to_f


Для целых чисел есть специальный метод (т.е. действие) .to_f, преобразующий их в числа с плавающей точкой на лету. Обратное действие (округление до целой части) выполняет метод .to_i.

Немного об ООП


В прошлой капле я говорил о том, что нам пока удается уходить от ООП. На самом деле я лукавил — в Руби всё, с чем мы манипулируем — это объекты. ВСЁ! Это отличает язык от C++ и Java, где присутствуют примитивные типы и фразы, не возвращающие значения.

При написании кода на Ruby, как и любого другого ОО кода, мы прежде всего создаем модели, а не пытаемся повторить весь процесс в коде. Например, если вам нужно написать приложение для кулинарной книги, вы, скорее всего, захотите создать список рецептов. Для моделирования вам придется использовать некоторые способы сортировки, чтобы воспроизводить различные виды данных, синхронизировать позиции необходимых данных в каждом списке и др. нонсенс. ООП делает работу легче, предлагая вам создавать классы и объекты, чтобы моделировать необходимые составляющие. В нашем примере вы можете создать класс Рецепты со строчными атрибутами название и автор и атрибутом в виде массива ингридиенты. Назначение класса — моделировать какую-либо вещь в вашей программе. Класс — это прототип, чертёж «существительных» в вашем прокте: объектов. Экземпляры класса или объекты (взаимозаменяемые термины) затем берут эти прототипы и запускают их в действие. В примере объекты могут быть созданы для каждого рецепта в списке, которые будут экземплярами класса Рецепты, который в свою очередь будет содержать данные и делать вещи, относящиеся к рецептам (например, держать список ингридиентов, добавлять ингридиенты в этот список, и т. п.) и следить за целостностью рецептов (например, что только числа в количествах ингридиентов, что каждый рецепт должен иметь название и др.) — все эти действия над объектами, «глаголы», и есть методы.

Вернемся к началам этой капли. Да, действительно, любое число — также полноценный объект. В примере 4.times {puts "Ruby"} число 4 — объект, является экземпляром класса Integer (мы об этом не заявляем в коде, Руби делает это за нас), к нему применяется метод times, который прописан в классе (опять мы этого не видим, но это подразумевается). Более того, даже в выражении x = 1 + x единица — это объект, а + — его метод! Вот так, не зная принципов ООП, мы уже, сами того не заметив, стали «жертвами» объектно-ориентированного программирования :)

Хватит — капля получилась хорошая, крупная, она дала нам все неоходимое, чтобы всерьёз переходить к реализации ООП на Ruby, что даст нам возможность двигаться дальше!

Как всегда жду ваших замечаний, отзывов и комментариев!

C четвертой каплей немного промазал, и она оказалась закопана под другими статьями — но она есть ;) ЗДЕСЬ!
Tags:
Hubs:
+45
Comments 69
Comments Comments 69

Articles