logo search
Программирование на языке Ruby

Листинг 20.3. Наблюдатель биржевых котировок (drb-клиент)

require "drb"

class Warner

 include DRbUndumped

 def initialize(ticker, limit)

  @limit = limit

  ticker.add_observer(self) # Любой объект Warner

                            # является наблюдателем.

 end

end

class WarnLow < Warner

 def update(time, price)    # Обратный вызов наблюдателя.

  if price < @limit

   print "--- #{time.to_s}: Цена ниже #@limit: #{price}\n"

  end

 end

end

class WarnHigh < Warner

 def update(time, price)    # Обратный вызов наблюдателя.

  if price > @limit

   print "+++ #{time.to_s}: Цена выше #@limit: #{price}\n"

  end

 end

end

DRb.start_service

ticker = DRbObject.new(nil, "druby://localhost:9001")

WarnLow.new(ticker, 90)

WarnHigh.new(ticker, 110)

puts 'Нажмите [return] для завершения.'

gets

Модуль DRbUndumped (см. листинге 20.3) следует включать в любой объект, который не нужно подвергать маршалингу. Самого присутствия этого модуля в числе предков объекта достаточно, чтобы drb не пытался применять к нему маршалинг. Вот исходный текст этого модуля целиком:

module DrbUndumped

def _dump(dummy)

raise TypeError, "can't dump"

end

end

Приложение из этого раздела достаточно содержательно, и в то же время в нем легко разобраться. Есть и другие подходы к решению подобных задач. Но способ, показанный нами, демонстрирует простоту и элегантность распределенного Ruby.