Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Виджеты FOX обладают современным внешним обликом. По полноте они могут соперничать с платформенными интерфейсами, в том числе и с MS Windows, при этом располагая возможностями, сильно превосходящими многие другие библиотеки виджетов.
Библиотеку классов FOX легко освоит программист, знакомый с другими средствами разработки графических интерфейсов. API не содержит зависимостей от платформы. Поскольку FOX написана на C++, некоторые аспекты API FxRuby сохраняют влияние статической природы и соглашений, принятых в C++ (например, перечисления и поразрядные операции).
Центральным механизмом, упрощающим работу с FOX, является парадигма сообщение/получатель. Любой объект в FOX — это экземпляр класса FXObjectили одного из его подклассов. Определяемые пользователем объекты также должны наследовать одному из этих классов. Любой экземпляр FXObjectможет посылать и получать сообщения. Сообщение связывается к конкретным получателем во время выполнения в момент отправки.
Внутри FOX сообщение представляется типом, идентификатором и данными. Классы FOX пользуются общим набором определений сообщений, что позволяет виджетам взаимодействовать.
Обработчик сообщения должен вернуть 1, если сообщение обработано, и 0 в противном случае. FOX не перенаправляет необработанные сообщения другим виджетам неявно. Возвращаемое значение используется для того, чтобы понять, нужно ли обновлять интерфейс. Приложение FXRuby могло бы воспользоваться возвращаемым значением, чтобы самостоятельно перенаправить необработанные сообщения и тем самым реализовать паттерн Chain of Responsibility (цепочка обязанностей), описанный в книге E. Gamma, R. Helm, R. Johnson, J. Vlissides «Design Patterns» [14] Русский перевод: Э. Гамма, Р. Хелм. Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. — М.: ДМК, Питер, 2001.
.
Еще один механизм FOX — парадигма автоматического обновления. Неявный цикл обработки событий в FOX включает фазу обновления, в которой объекты FOX могут обработать сообщения об обновлении. Обычно обработчик такого сообщения изменяет внешний вид того или иного виджета, основываясь на текущем состоянии данных приложения. Например, программа, показанная в листинге 12.9 (см. раздел 12.3.3), имеет кнопку, которая обновляет собственное состояние «активна/не активна» в зависимости от значения некоторой переменной.
12.3.2. Простое оконное приложение
Вот пример минимального приложения FXRuby, которое делает то же самое, что рассмотренные выше приложения Tk и GTK+:
require 'fox16' # Используются привязки к FOX 1.6.
include Fox
application = FXApp.new
main = FXMainWindow.new(application, "Today's Date")
str = Time.now.strftime("&Today is %B %d, %Y")
button = FXButton.new(main, str)
button.connect(SEL_COMMAND) { application.exit }
application.create
main.show(PLACEMENT_SCREEN)
application.run
Этого примера достаточно для демонстрации двух важнейших классов FXRuby: FXAppи FXMainWindow. Приложение должно в самом начале создать и инициализировать объект FXApp. FXMainWindow— подкласс FXTopWindow; каждый виджет в FOX — некая разновидность «окна». Класс FXTopWindowпредставляет окно верхнего уровня, которое появляется непосредственно на экране. Более сложное приложение FXRuby обычно создает подкласс FXMainWindowи размещает в нем виджеты на этапе инициализации.
Конструктору FXMainWindowнеобходимо передать первым параметром объект FXApp. Второй параметр — заголовок окна. По умолчанию экземпляр FXMainWindowразмещается в центре экрана и снабжается всеми стандартными элементами, присущими FXTopWindow. Таким образом, для окна отображается полоса заголовка с кнопками свертывания, развертывания и закрытия. Его размеры можно изменять.
Атрибут decorationsглавного окна позволяет явно указать необходимые элементы оформления. Например, можно запретить изменение размеров:
main = FXMainWindow.new(application, "Today's Date")
main.decorations = DECOR_TITLE | DECOR_CLOSE
Значение decorationsобразуется комбинированием битовых флагов, как это принято в C++. В примере выше окно имеет только заголовок и кнопку закрытия.
В этом простом примере главное окно содержит всего один виджет — экземпляр класса FXButton, в котором отображается текущая дата.
str = Time.now.strftime("&Today is %B %d, %Y")
button = FXButton.new(main, str)
Первый аргумент конструктора FXButton— родительское окно, содержащее данный виджет. В нашем примере это главное окно. Второй аргумент — текст, рисуемый на кнопке.
В следующей строчке показано, как с помощью метода connectассоциировать с кнопкой блок:
button.connect(SEL_COMMAND) { application.exit }
Здесь говорится, что когда кнопка отправляет командное сообщение (то есть сообщение типа SEL_COMMAND), следует вызвать метод exit.
В оставшихся строчках мы наблюдаем «ритуал обручения» объектов FXAppи FXMainWindow:
application.create
main.show(PLACEMENT_SCREEN)
application.run
Любое приложение FXRuby должно включать подобные строки, чтобы создать экземпляр приложения, показать окно FXMainWindowи запустить цикл обработки событий. Аргумент PLACEMENT_SCREENметода showопределяет, в каком месте экрана должно появиться окно. Из других возможных значений упомянем PLACEMENT_CURSOR(поместить окно там, где находится курсор), PLACEMENT_OWNER(в центре окна-владельца) и PLACEMENT_MAXIMIZED(раскрыть окно на весь экран).
12.3.3. Кнопки
Вы уже видели, как организуется работа с кнопками в FXRuby. Заглянем немного глубже.
На кнопке может размещаться не только короткая строка. Допустимы и несколько строк, разделенных символом новой строки:
text = "&Hello, World!\n" +
"Do you see multiple lines of text?"
FXButton.new(self, text)
Обратите внимание на амперсанд перед буквой H в строке "Hello, World!". Он задает «горячую клавишу», нажатие которой эквивалентно щелчку по кнопке.
На кнопке может быть также нарисовано изображение, заданное в разных форматах. Например:
text = "&Неllо, World!\n" +
"Do you see the icon?\n" +
"Do you see multiple lines of text?"
icon = File.open("some_icon.gif", "rb") do |file|
FXGIFIcon.new(app, file.read)
end
FXButton.new(self, text, icon)
В листинге 12.9 иллюстрируется механизм обновления состояния интерфейса, реализованный в FOX:
require 'fox16'
include Fox
class TwoButtonUpdateWindow < FXMainWindow
def initialize(app)
# Сначала инициализируем базовый класс.
super(app, "Update Example", nil, nil,
DECOR_TITLE | DECOR_CLOSE)
# Первая кнопка:
@button_one = FXButton.new(self, "Enable Button 2")
@button_one_enabled = true
# Вторая кнопка:
@button_two = FXButton.new(self, "Enable Button 1")
@button_two.disable
@button_two_enabled = false
Интервал:
Закладка: