Обработка событий в Ruby - PullRequest
       14

Обработка событий в Ruby

1 голос
/ 16 декабря 2009

Я хочу иметь возможность обрабатывать события с помощью ruby. Я знаю, что нет никакого собственного способа сделать это, но я нашел решение здесь в stackoverflow:

class EventBase
    def initialize
        @listeners = Hash.new
    end

    def listen_event(name, *func, &p)
        if p
            (@listeners[name] ||= Array.new) << p
        else
            (@listeners[name] ||= Array.new) << func[0]
        end
    end

    def ignore_event(name, func)
        return if !@listeners.has_key?(name)
        @listeners[name].delete_if { |o| o == func }
    end

    def trigger_event(name, *args)
        return if !@listeners.has_key?(name)
        @listeners[name].each { |f| f.call(*args) }
    end
end


class MyClass < EventBase
    def raise_event1(*args)
        trigger_event(:event1, *args)
    end

    def raise_event2(*args)
        trigger_event(:event2, *args)
    end
end

class TestListener
    def initialize(source)
        source.listen_event(:event1, method(:event1_arrival))
        source.listen_event(:event2) do |*a|
            puts "event 2 arrival, args #{a}"
        end
    end

    def event1_arrival(*a)
        puts "Event 1 arrived, args #{a}"
    end
end

Проблема заключается в следующем: 1. Кажется, когда вы добавляете метод в массив прослушивания, он выполняется сразу 2- Когда событие срабатывает, оно генерирует вызов метода NoMethodError: undefined для nil: NilClass

Я новичок в ruby, поэтому я не понимаю код полностью, я чувствую, что в нем не хватает некоторых фрагментов кода ... (в основном потому, что я не знаю весь синтаксис ruby) спасибо

Некоторые вопросы: - Что значит & р? - Что такое || =? - что значит <

Ответы [ 3 ]

4 голосов
/ 16 декабря 2009

Я думаю, что вы, возможно, пытаетесь изобрести колесо здесь. Я бы рекомендовал вместо этого использовать Observable. Он находится в стандартной библиотеке, просто require "observer" и include модуль Observable в вашем классе.

1 голос
/ 03 января 2013

Если вы хотите выполнять обработку событий в небольшом скрипте на Ruby (то есть: НЕ в веб-приложении), то я рекомендую использовать гем Unobservable (например, это НЕ наблюдаемый гем, хар хар хар ). Вы можете найти некоторые основные детали / ссылки о драгоценном камне здесь:

https://briandamaged.org/blog/?p=1074

https://briandamaged.org/blog/?p=1161

Этот драгоценный камень позволяет легко определять несколько событий в одном объекте. Например:

require 'unobservable'

class Button
  include Unobservable::Support

  attr_event :clicked
  attr_event :double_clicked

  def click(x, y)
    raise_event(:clicked, x, y)
  end

  def double_click(x, y)
    raise_event(:double_clicked, x, y)
  end
end

button  = Button.new
button.clicked.register {|x, y| puts "You just clicked: #{x} #{y}"}

button.click(2, 3)
1 голос
/ 16 декабря 2009

Lol, хорошо, я решил проблему ... я неправильно вызывал listen_event ...

должно быть listen_event (: indexChanged, метод (: sayIndex)) не listen_event (: indexChanged, sayIndex (: индекс))

все еще учатся на веревках на рубине LOL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...