我正在尝试执行记忆表转换以进行模式升级。在我的新架构中,我从以前的记录定义中删除了一个字段。架构的其余部分保持不变。这是一些代码-
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,...}]}
(从注释复制)
Dialyzer 的错误在于当记录中没有 34 个元素时,它试图获取第 34 个元素的类型。反过来,这是因为透析器OldRecord
的类型错误。
准确找到类型推断出您意想不到的内容的位置可能很棘手。最简单(尽管仍然不容易)的解决方案是在更多位置注释类型。例如,如果您分解fun (OldRecord)
并给它一个-spec
,Dialyzer 会给你一个更有用的错误消息。