나는 오늘 @ avdi의 루비 타파스 에피소드에서 다음 코드를 가지고 : 나는 이벤트와 청취자와 관찰자 패턴의 개념을 이해이벤트 선언
module Eventful
def self.included(other)
other.extend(Macros)
end
def add_listener(listener)
(@listeners ||= []) << listener
end
def notify_listeners(event, *args)
(@listeners || []).each do |listener|
listener.public_send("on_#{event}", *args)
end
end
module Macros
def event(name)
module_eval(%Q{
def #{name}(*args)
notify_listeners(:#{name}, *args)
end
})
end
end
end
class Dradis
include Eventful
event :new_contact
end
class ConsoleListener
def on_new_contact(direction, range)
puts "DRADIS contact! #{range} kilometers, bearing #{direction}"
end
end
dradis = Dradis.new
dradis.add_listener(ConsoleListener.new)
dradis.new_contact(120, 23000)
을하지만,이 구문은 왜하는 방법 /하지 않는다 일하고 있고, 어떤 매뉴얼에서도 그것을 보지 못했다.
dradis = Dradis.new
dradis.event
:
event :new_contact
는 처음에 나는 event
이 방법이었고, 나는, Dradis
의 인스턴스에 뭔가를 event
를 호출 할 수 있도록 :new_contact
인수이라고 생각 : 클래스 Dradis
이가있다 대신, new_contact
가 Dradis
의 인스턴스에서 호출 같은 :
dradis = Dradis.new
dradis.add_listener(ConsoleListener.new)
dradis.new_contact(120, 23000)
그 매크로 모듈에서 event
메서드를 트리거합니다.
아무도 왜 이렇게 작동하는지 설명 할 수 있습니까? 인스턴스 dradis
에 :new_contact
을 호출하면 이벤트 메소드가 트리거됩니까?
감사를 호출하는 dynammically 생성 방법
new_contact
입니다? 어떻게 이벤트가 호출됩니까? – BrainLikeADullPencil아니요, Dradis 클래스가 구문 분석되어로드 될 때 호출됩니다. –