Erlangのgen_fsmモジュールを使用してメニューオプションを管理するかなり大きなUSSDアプリケーションがあります。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へのエントリポイントなどを示します。
新バージョンでは、我々はそうのように、menus_fsm
から呼び出される新しいモジュールhelp_menu
にhelp_menu/1
とwaitHelpMenuChoice/2
を移動したいと思いますが:
-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};
と、問題の行を交換しようとしたが、それはちょうど、次のようなエラーにLEAS: {badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
誰もがこの問題を回避する方法のいずれかの提案を持っていますか?