Тут можно читать онлайн книгу Фултон Хэл - Программирование на языке Ruby - бесплатно полную версию (целиком). Жанр книги: Программирование. Вы можете прочесть полную версию (весь текст) онлайн без регистрации и смс на сайте Lib-King.Ru (Либ-Кинг) или прочитать краткое содержание, аннотацию (предисловие), описание и ознакомиться с отзывами (комментариями) о произведении.
Программирование на языке Ruby - описание и краткое содержание, автор Фултон Хэл, читать бесплатно онлайн на сайте электронной библиотеки Lib-King.Ru.
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов. Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии. Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать книгу онлайн бесплатно, автор Фултон Хэл
Но мы добавили одну тонкость. Не желая следить за малейшими колебаниями цен, мы реализовали модуль
ObserverСначала рассмотрим модуль
DrbObservableObserverВ листинге 20.1 наблюдатель определен как объект, отвечающий на вызов метода update. Сервер добавляет наблюдателей по их просьбе и посылает им уведомления, обращаясь к методу
notify_observersmodule DRbObservable def add_observer(observer) @observer_peers ||= [] unless observer.respond_to? :update raise NameError, "наблюдатель должен отвечать на вызов 'update'" end @observer_peers.push observer end def delete_observer(observer) @observer_peers.delete observer if defined? @observer_peers end def notify_observers(*arg) return unless defined? @observer_peers for i in @observer_peers.dup begin i.update(*arg) rescue delete_observer(i) end end endendСервер (он же канал) в листинге 20.2 эмулирует биржевые котировки с помощью последовательности псевдослучайных чисел (простите мою иронию, но это очень точно соответствует характеру рынка). Символ, идентифицирующий компанию, — всего лишь косметическое украшение, никакого реального смысла в этой программе он не имеет. При каждом изменении цены посылается уведомление всем наблюдателям.
require "drb"require "drb_pbserver"# Генерировать случайные котировки.class MockPrice MIN = 75 RANGE = 50 def initialize(symbol) @price = RANGE / 2 end def price @price += (rand() - 0.5)*RANGE if @price < 0 @price = [email protected] elsif @price >= RANGE @price = 2*RANGE - @price end MIN + @price endendclass Ticker # Периодически получать котировку акций. include DRbObservable def initialize(price_feed) @feed = price_feed Thread.new { run } end def run lastPrice = nil loop do price = @feed.price print "Текущая котировка: #{price}\n" if price != lastPrice lastPrice = price notify_observers(Time.now, price) end sleep 1 end endendticker = Ticker.new(MockPrice.new("MSFT"))DRb.start_service('druby://localhost:9001', ticker)puts 'Нажмите [return] для завершения.'getsНа платформе Windows примененный способ завершения программы вызывает сложности. Функция
getsgetsDRb.thread.joinНеудивительно, что клиент (листинг 20.3) начинает с установления соединения с сервером. Он получает ссылку на объект показа котировок и устанавливает верхний и нижний пороги изменения цены. Затем клиент выводит сообщение пользователю всякий раз, как цена выходит за пределы указанного диапазона.
require "drb"class Warner include DRbUndumped def initialize(ticker, limit) @limit = limit ticker.add_observer(self) # Любой объект Warner # является наблюдателем. endendclass WarnLow < Warner def update(time, price) # Обратный вызов наблюдателя.