#crash #erlang #match #case
#сбой #erlang #совпадение #случай
Вопрос:
Я столкнулся с очень необычным случаем_аварийного сбоя при тестировании моей программы Erlang.
createPattern(PatternId, Analyzer, PatternDesc) when is_list(PatternDesc) ->
F = fun() ->
case mnesia:wread({patterns, PatternId}) of
[] ->
mnesia:write(#patterns{pattern_id = PatternId, analyzer = Analyzer, pattern_desc = PatternDesc}),
{?RESULT_PASSED, ?REASON_CREATED};
_ -> {?RESULT_FAILED, ?REASON_EXISTS}
end
end,
case Analyzer of
{script, ScriptName} ->
case io_lib:latin1_char_list(ScriptName) of
true -> ok
end;
{erlang, {M, F}} ->
case utils:loadModule(M, F, 2) of
{?RESULT_PASSED, _} -> ok
end;
{expression, Expression} ->
utils:screenExpression(Expression);
{expression_group, ExpressionGroup} ->
utils:screenExpressionGroup(ExpressionGroup)
end,
mnesia:activity(transaction, F).
Я передаю Analyzer со значением {erlang, {plugin, evaluate}} . Я получаю сбой case_clause. Когда я заменил {erlang, {M, F}} на {erlang, {Module, Function}}, совпадение прошло успешно.
Теперь это необычно, потому что шаблон тот же, а M и F не были объявлены ранее. Так что он должен совпадать.
Я использую erlang 23. Чего мне здесь не хватает?
Спасибо.
Ответ №1:
Ну, на самом деле вы уже определяли F как функцию раньше (см. Ниже). Может быть, вы хотите начать с этого.
F = fun() ->
Комментарии:
1. Ах, какой я глупый! Спасибо. Поделом мне за то, что я делаю это поздно ночью. Спасибо.