Ruby

индекс
128,98

Рецепты: Свои наборы обработчиков событий

Думаю, большинство из пользователей Ruby работали с Rails, и использовали их обработчики событий.

  1. validate :validate_humanity_conflicts
  2. validates_presence_of :radius # это не обработчик события, но декларация

Польза от них очевидна:
  • Декларативность описания поведения, когда мы видим особенности классов по декларациям в его начале;
  • Возможность создавать наборы из обработчиков событий, не заморачиваясь на управление ими.
Нам, скорее всего, захочется использовать декларации для удобства описания своих собственных событий.

И я покажу, как это делать:

  1. class AnyClass
  2.   include ActiveSupport::Callbacks # already included by ActiveRecord::Base
  3.   define_callbacks :after_something
  4.   def after_something
  5.     run_callbacks(:after_something)
  6.   end
  7. end

  1. class ChildClass < AnyClass
  2.   after_something :eliminate_frags
  3.   def eliminate_frags
  4.     # do it
  5.     true # to stop callback chain return false
  6.   end
  7. end


Для работы данного функционала нужен gem active_support (входит в состав rails).

Чуть не забыл, цепочка обработчиков событий в данном случае будет вызвана при вызове метода экземпляра 
  1. after_something

______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru
+11
21 августа 2009, 18:46
15

комментарии (3)

+1
Ewg #
Ruby рулит.
0
akzhan #
Но, кстати, данный рецепт можно повторить и в строго типизированном языке программирования, например, с помощью атрибутов в C#, за счёт контекстов ;)

Просто реализовать это в Ruby на порядок проще :)
0
f1tz #
Пример из API куда понятнее:

class Storage
  include ActiveSupport::Callbacks

  define_callbacks :before_save, :after_save
end

class ConfigStorage < Storage
  before_save :pass
  before_save :pass
  before_save :stop
  before_save :pass

  def pass
    puts "pass"
  end

  def stop
    puts "stop"
    return false
  end

  def save
    result = run_callbacks(:before_save) { |result, object| result == false }
    puts "- save" if result
  end
end

config = ConfigStorage.new
config.save

______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.