书上案例学习并测试
23.1 通用事件处理
-module(event_handler).
%% API
-export([make/1, add_handler/2, event/2]).%% 制作一个“什么都不干”的事件处理器Name(一个原子)。这样消息就有地方发送了。
make(Name) ->register(Name, spawn(fun() -> my_handler(fun no_op/1) end)).%% 给名为Name的事件处理器添加一个处理函数Fun。这样当事件X发生时,事件处理器就会执行Fun(X)。
add_handler(Name, Fun) -> Name ! {add, Fun}.%% 发送消息X到名为Name的事件处理器。
event(Name, X) -> Name ! {event, X}.my_handler(Fun) ->receive{add, Fun1} ->my_handler(Fun1);{event, Any} ->(catch Fun(Any)),my_handler(Fun)end.
no_op(_) -> void.
运行结果
如果需要使用事件处理器进行事件处理,需要重新写一个事件处理器回调模块。
-module(motor_controller).%% API
-export([add_event_handler/0]).add_event_handler() ->event_handler:add_handler(error, fun controller/1).%%接收到的为too_hot则调用上方函数,否则调用下方
controller(too_hot) ->io:format("Turn off the motor~n");
controller(X) ->io:format("~w ignored event: ~p~n", [?MODULE, X]).
输出结果为