首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从记录中删除字段时出现透析器错误

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

Stack Overflow用户
提问于 2015-01-06 06:35:46
回答 1查看 60关注 0票数 0

出于模式升级的目的,我正在尝试执行记忆体表转换。在我的新模式中,我从以前的记录定义中删除了一个字段。架构的其余部分保持不变。下面是一些代码-

代码语言:javascript
运行
复制
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个字段后,dialyzer报告试图访问元素#34的记录范围之外的索引。然而,我觉得这很奇怪,因为'mnesia:transform_table‘可以在任何记录上执行,其大小可以是34、33或其他任何值。为什么透析器要抱怨呢?感谢一些关于修复这个问题的指导。

透析器错误-

代码语言:javascript
运行
复制
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,...}]}
EN

回答 1

Stack Overflow用户

发布于 2015-01-09 00:35:16

(从评论中复制)

来自Dialyzer的错误来自于当记录中没有34个元素时试图获取第34个元素的类型。反过来,这是因为透析器得到了错误的OldRecord类型。

准确地找到类型是从哪里推断出来的,这可能是您没有预料到的事情。最简单(尽管仍然不容易)的解决方案是在更多的地方注释类型。例如,如果您提取fun (OldRecord)并给它一个-spec,那么Dialyzer会给您一个更有用的错误消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27789082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档