Хэл Фултон - Программирование на языке 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]
Интервал:
Закладка: