Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
puts t.strftime("%I:%М %p") # Печатается 10:07 PM
Есть и другие возможности — поэкспериментируйте!
7.15 Сравнение моментов времени
К классу Timeподмешан модуль Comparable, поэтому моменты времени можно сравнивать непосредственно:
t0 = Time.local(2000,11,10,22,15) # 10 Nov 2000 22:15
t1 = Time.local(2000,11,9,23,45) # 9 Nov 2000 23:45
t2 = Time.local(2000,11,12,8,10) # 12 Nov 2000 8:10
t3 = Time.local(2000,11,11,10,25) # 11 Nov 2000 10:25
if t0 < t1 then puts "t0 < t1" end
if t1 != t2 then puts "t1 != t2" end
if t1 <= t2 then puts "t1 <= t2" end
if t3.between?(t1,t2)
puts "t3 находится между t1 и t2"
end
# Все четыре предложения if возвращают true.
7.16 Прибавление интервала к моменту времени
Можно получить новый момент времени, прибавив к существующему интервал. Последний представляется целым числом, которое интерпретируется как число секунд.
t0 = Time.now
t1 = t0 + 60 # Ровно одна минута с момента t0.
t2 = t0 + 3600 # Ровно один час с момента t0.
t3 = t0 + 86400 # Ровно один день с момента t0.
Может пригодиться функция dhms2sec(определена в разделе 7.6). Напомним, что по умолчанию параметры, соответствующие часам, минутам и секундам, равны 0.
t4 = t0 + dhms2sec(5,10) # 5 дней, 10 часов в будущем.
t5 = t0 + dhms2sec(22,18,15) # 22 дня, 18 часов, 15 минут в будущем.
t6 = t0 - dhms2sec(7) # Ровно неделю назад.
Не забывайте, что для получения момента времени в прошлом нужно вычитать, как при вычислении t6в примере выше.
7.17. Вычисление разности между двумя моментами времени
Можно вычислить интервал между двумя моментами времени. В результате вычитания одного объекта Timeиз другого получаем число секунд:
today = Time.local(2000,11,10)
yesterday = Time.local(2000,11,9)
cliff = today - yesterday # 86400 секунд.
И снова оказывается полезной функция sec2dhms, которая определена в разделе 7.6.
past = Time. Local(1998,9,13,4,15)
now = Time.local(2000,11,10,22,42)
diff = now - past unit = sec2dhms(diff)
puts "#{unit[0]} дней," # 789 дней,
puts "#{unit[1]} часов," # 18 часов,
puts "#{unit[2]} минут" # 27 минут
puts "и #{unit[3]} секунд." # и 0 секунд.
7.18. Работа с конкретными датами (до точки отсчета)
В стандартной библиотеке Dateесть одноименный класс для работы с датами, предшествующими полуночи 1 января 1970 года.
Несмотря на некоторое перекрытие с классом Time, между ними есть существенные различия. Самое главное состоит в том, что класс Dateвообще игнорирует время, то есть работает с точностью до одного дня. Кроме того, класс Dateстроже контролирует ошибки, чем класс Time: попытка обратиться к 31 июня (или к 29 февраля невисокосного года) приведет к исключению. Код даже «знает» о различных датах перехода на григорианский календарь в Италии и Англии (в 1582 и 1752 году соответственно) и может обнаружить «несуществующие» даты, появившиеся в результате такого перехода. Эта стандартная библиотека — паноптикум интересного и местами загадочного кода. К сожалению, у нас нет места для более подробного разговора о ней.
7.19. Взаимные преобразования объектов Date, Time и DateTime
В Ruby есть три основных класса для работы с датами и временем: Time, Dateи DateTime. Опишем их особенности:
• Класс Timeпреимущественно обертывает соответствующие функции из стандартной библиотеки языка С. Они, как правило, опираются на точку отсчета в UNIX и потому не способны представлять моменты времени раньше 1970 года.
• Класс Dateсоздан для преодоления недостатков класса Time. Он без труда справляется с датами в более отдаленном прошлом — например, позволяет представить день рождения Леонардо да Винчи (15 апреля 1452 года), и, кроме того, знает о реформе календаря. Но у него есть свои слабые места: он работает только с датами, игнорируя время.
• Класс DateTimeнаследует Dateи пытается компенсировать отсутствующие в нем возможности. Он может представлять даты не хуже Dateи время не хуже Time. Часто его способ представления даты и времени оказывается наилучшим.
Однако не думайте, что объект DateTime— это просто объект Date, к которому механически присоединен объект Time. На самом деле в классе DateTimeотсутствуют такие методы, как usec, dst?и некоторые другие.
Итак, у нас есть три класса. К сожалению, не существует стандартного способа преобразовать один из них в любой другой. По мере развития Ruby подобные шероховатости будут устраняться. А пока обойдемся методами, приведенными в листинге 7.2. Спасибо Кирку Хейнсу (Kirk Haines).
class Time
def to_date
Date.new(year, month, day)
rescue NameError
nil
end
def to_datetime
DateTime.new(year, month, day, hour, min, sec)
rescue NameError
nil
end
end
class DateTime
def to_time
Time.local(year,month,day,hour,min,sec)
end
end
class Date
def to_time
Time.local(year,month,day)
end
end
Эти методы пропускают наверх все исключения, кроме NameError. Зачем нужно его перехватывать? Потому что могло случиться так, что программа не затребовала (с помощью директивы require) библиотеку date(напомним, что классы Dateи DateTimeвходят в эту стандартную библиотеку, а не являются системными). В таком случае методы to_datetimeи to_dateвозвращают nil.
7.20. Извлечение даты и времени из строки
Дата и время могут быть представлены в виде строки самыми разными способами: в полной или сокращенной форме, с разной пунктуацией, различным порядком компонентов и т.д. Из-за такого разнообразия очень сложно написать код, интерпретирующий символьную строку как дату. Рассмотрим несколько примеров:
s1 = "9/13/98 2:15am"
s2 = "1961-05-31"
s3 = "11 July 1924"
s4 = "April 17, 1929"
s5 = "20 July 1969 16:17 EDT"
s6 = "Mon Nov 13 2000"
s7 = "August 24, 79" # День разрушения Помпеи.
s8 = "8/24/79"
К счастью, большую часть работы за нас уже проделали. В модуле ParseDateесть единственный класс с таким же именем, а в нем — единственный метод parsedate. Он возвращает массив компонентов даты в следующем порядке: год, месяц, день, час, минута, секунда, часовой пояс, день недели. Вместо полей, которые не удалось распознать, возвращается nil.
require "parsedate.rb"
include ParseDate
p parsedate(s1) # [98, 9, 13, 2, 15, nil, nil, nil]
p parsedate(s2) # [1961, 5, 31, nil, nil, nil, nil, nil]
p parsedate(s3) # [1924, 7, 11, nil, nil, nil, nil, nil]
p parsedate(s4) # [1929, 4, 17, nil, nil, nil, nil, nil]
p parsedate(s5) # [1969, 7, 20, 16, 17, nil, "EDT", nil]
p parsedate(s6) # [2000, 11, 13, nil, nil, nil, nil, 1]
Интервал:
Закладка: