首页 > 解决方案 > Erlang:不寻常的case_clause崩溃

问题描述

在测试我的 Erlang 程序时,我遇到了一个非常不寻常的 case_clause 匹配失败。

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).

我通过值为 {erlang, {plugin, evaluate}} 的分析器。我遇到了 case_clause 崩溃。当我用 {erlang, {Module, Function}} 替换 {erlang, {M, F}} 时,匹配成功。

现在这是不寻常的,因为模式是相同的,并且 M 和 F 没有事先声明。所以应该匹配。

我正在运行 erlang 23。我在这里缺少什么?

谢谢。

标签: crasherlangmatchcase

解决方案


好吧,您实际上之前确实将 F 定义为函数(见下文)。也许你想从那个开始。

F = fun() ->


推荐阅读