删除记录中的字段时出现透析器错误

时间:2015-01-05 22:35:46

标签: erlang mnesia dialyzer

我正在尝试执行mnesia表转换以进行架构升级。在我的新架构中,我从先前的记录定义中删除了一个字段。架构的其余部分保持不变。这是一些代码 -

XformFun = fun(OldRecord) ->
    NewRecord = #bdm_employee{id=element(2, OldRecord), name=element(3, OldRecord),
                                address=element(4, OldRecord),
                                job_type=element(6, OldRecord),
                                ...
                                description=element(34, OldRecord)},
    NewRecord
end,
mnesia:transform_table(bdm_employee, XformFun, record_info(fields, bdm_employee))

我原来的记录有34个字段。在移除第5个字段后,透析器会抱怨尝试访问元素#34的记录范围之外的索引。但是,我发现这很奇怪,因为&mnesia:transform_table'可以在任何记录上执行,其大小可以是34,33或其他任何记录。为什么透析器会抱怨?感谢一些解决这个问题的指导......

透析器错误 -

dialyzer: Analysis failed with error:
{function_clause,[{lists,nth,2,[]},
                  {dialyzer_typesig,find_element,2,[]},
                  {dialyzer_typesig,get_bif_constr,4,[]},
                  {dialyzer_typesig,handle_call,3,[]},
                  {dialyzer_typesig,traverse,3,[]},
                  {dialyzer_typesig,handle_clauses_1,7,...},
                  {dialyzer_typesig,handle_clauses,...},
                  {dialyzer_typesig,...}]}

1 个答案:

答案 0 :(得分:0)

(从评论中复制)

Dialyzer的错误来自于它在记录中没有34个元素时尝试获取第34个元素的类型。反过来,这是因为Dialyzer的OldRecord类型错误。

确切地找到类型被推断到你没想到的东西的位置可能会很棘手。最简单(但仍然不容易)的解决方案是在更多地方注释类型。例如,如果您将fun (OldRecord)计算在内并将其设为-spec,则Dialyzer会向您提供更有用的错误消息。