Я хочу иметь возможность обрабатывать события с помощью 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)
спасибо
Некоторые вопросы:
- Что значит & р?
- Что такое || =?
- что значит <