我们有一个相当大的 USSD 应用程序,它使用 Erlang 的 gen_fsm 模块来管理菜单选项。
当前版本有一个menus_fsm.erl
包含 5000 多行 gen_fsm 相关代码的文件。我们的下一个版本让我们有机会将其拆分menus_fsm.erl
为单独的文件,以使其在未来更易于维护。
在旧版本中,为了显示帮助菜单,我们执行以下操作(help_menu/1
从显示主菜单的未显示代码中调用):
-module(menus_fsm).
% Snipped some irrelvant code
help_menu(StateData) ->
% Display the first menu
send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
doTerminate(ok,"Help Menu", StateData).
我遗漏了很多显示 FSM 入口点的代码等等。
在新版本中,我们希望将help_menu/1
和waitHelpMenuChoice/2
移至一个新模块help_menu
,该模块从 调用menus_fsm
,如下所示:
-module( help_menu ).
% Snipped some irrelevant code
help_menu(StateData) ->
menus_fsm:send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
menus_fsm:doTerminate(ok,"Help Menu", StateData).
问题出在这行{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
:gen_fsm
期望waitHelpMenuChoice
在模块menus_fsm
中,这将我带回到我们开始的地方。
我试图用
{next_state, fun help_menu:waitHelpMenuChoice/2, StateData, ?MENU_TOUT};
但这只会导致如下错误:
{badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
有人对如何解决这个问题有任何建议吗?