Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
weeks[i+1] << list.shift end end pad_first = 7-weeks[0].size pad_first.times { weeks[0].unshift(nil) } pad_last = 7-weeks[0].size pad_last.times { weeks[-1].unshift(nil) } weeksendarr = calendar(12,2008) # [[nil, 1, 2, 3, 4, 5, 6], # [7, 8, 9, 10, 11, 12, 13], # [14, 15, 16, 17, 18, 19, 20], # [21, 22, 23, 24, 25, 26, 27], # [28, 29, 30, 31, nil, nil, nil]]Чтобы было понятнее, распечатаем этот массив массивов:
def print_calendar(month,year) weeks = calendar(month,year) weeks.each do |wk| wk.each do |d| item = d.nil? ? " "*4 : " %2d " % d print item end puts end putsend# Выводится:# 1 2 3 4 5 6# 7 8 9 10 11 12 13# 14 15 16 17 18 19 20# 21 22 23 24 25 26 27# 28 29 30 317.25. Заключение
В этой главе мы рассмотрели класс
TimeМы также узнали, зачем существуют классы
DateDateTimeНа этом обсуждение даты и времени завершается. Переходим к массивам, хэшам и другим перечисляемым структурам в Ruby.
Глава 8. Массивы, хэши и другие перечисляемые структуры
Все детали должны соединяться без усилий. Помните, что механизм, который вы пытаетесь собрать, вами же был и разобран.
Если не удается соединить детали, на то должна быть причина.
Ни в коем случае не пользуйтесь молотком.
Простых переменных для практического программирования недостаточно. В любом современном языке поддерживаются более сложные виды структурированных данных и предоставляются механизмы для создания новых абстрактных типов данных.
Исторически самой первой и широко распространившейся составной структурой данных был массив. Давным-давно, еще в языке ФОРТРАН, массивы назывались индексированными переменными; сегодня они несколько видоизменились, но основная идея во всех языках одна и та же.
Относительно недавно очень популярной структурой стали хэши. Как и массив, хэш представляет собой индексированный набор данных. Но, в отличие от массива, в качестве индекса может выступать любой объект. (В Ruby, как и в большинстве других языков, элементы массива индексируются числами.)
Наконец, мы рассмотрим сам модуль
Enumerable8.1. Массивы
В Ruby массивы индексируются целыми числами; индексация начинается с нуля, как в языке С. На этом, впрочем, сходство и заканчивается.
Массивы в Ruby динамические. Можно (хотя это и не обязательно) задать размер массива при создании. Но после создания он может расти без вмешательства со стороны программиста.
Массивы в Ruby неоднородны, то есть в них могут храниться данные разных типов. На самом деле в массиве хранятся только ссылки на объекты, а не объекты как таковые. Исключение составляют только непосредственные значения, например объекта класса
FixnumВместе с массивом хранится и его длина, поэтому нам не нужно тратить время на ее вычисление или сохранение во внешней переменной, обновляемой синхронно с массивом. К тому же итераторы определены таким образом, что на практике нам вообще редко приходится задумываться о длине массива.
Наконец, класс
Array8.1.1. Создание и инициализация массива
Для создания массива применяется специальный метод класса
[]аbсa = Array.[] (1,2,3,4)b = Array[1,2,3,4]с = [1,2,3,4]Имеется также метод класса
newd = Array.new # Создать пустой массив.е = Array.new(3) # [nil, nil, nil]f = Array.new(3, "blah") # ["blah", "blah", "blah"]Обратите особое внимание на последний пример. Типичная «ошибка начинающего» — думать, что все объекты в этом массиве различны. На самом деле это три ссылки на один и тот же объект. Поэтому, если вы его измените (а не замените другим), то изменятся все элементы массива. Чтобы не попасть в эту ловушку, воспользуйтесь блоком. Блок будет вычисляться по одному разу для каждого элемента, поэтому все элементы окажутся различными объектами:
f[0].capitalize! # f равно: ["Blah", "Blah", "Blah"]g = Array.new(3) { "blah" } # ["blah", "blah", "blah"]g[0].capitalize! # g равно: ["Blah", "blah", "blah"]
