2014-10-04 283 views
0

希望这是我的问题所在(在阅读Erlang打印的错误日志时出现问题)。我试图通过列表搜索来查找匹配的字符串(来自客户端的PID转换为字符串),但它只是导致崩溃。Erlang:在列表中搜索匹配的字符串

... 
#7 ClientPID = pid_to_list(From), 
#8 list:member(ClientPID, #server.users), % 'users' being a list in the record 'server' 
... 

'服务器'记录中'用户'列表刚定义为users = [],如果有帮助的话。

崩溃报告:

** Reason for termination == 
** "{undef,[{list,member,[\"<0.568.0>\",2],[]}, {server,loop,2,[{file,\"server.erl\"},{line,8}]}, 
{genserver,loop,2,[{file,\"c:/Erlang/ServCli/genserver.erl\"}{line,13}]}]}" 

回答

2

模块称为listslist。这是常见的错误:)

而你的论点很少。您正在使用记录,正确的用法如下所示:VariableThatStoresRecord#record_name.filed_name。在你的情况下,它可能类似State#state.users(或只是缩短State参数loop功能S如果你不喜欢这种双重状态)。

你在做什么实际上是一个语义suger,它返回记录/元组给定字段中的哪个元素(因为所有记录实际上都是元组)。在你的情况下,#state.users返回2(第一个元素是记录名称,我想users是您的记录中第一个定义的字段)。

关于错误消息。首先是你得到的东西undef错误。所以这意味着你在调用未定义的函数(这很常见,因为Erlang是动态语言)。比你得到的元组的列表,它代表呼叫跟踪,从最新到最旧这样

[ { function call definition } 
    { function call definition } 
    { function call definition } ] 

第一个是最有趣的,因为它是调用未定义的函数。您可以看到它是对模块list和功能member的调用。除此之外,您可以预期实际参数或者只是真实性(这些变量可能已经在erlang中被垃圾收集)以及一些关于函数定义的信息(如文件和行号)。

而从{list,member,[\"<0.568.0>\",2],[]}您可以看到您正在尝试呼叫list:member函数,其参数为"<0.568.0>"2。如果您将电话更改为lists:member(ClientPID, Server#server.users),它应该可以工作。

由于大多数错误消息通常是嵌套的元组/列表,如果它们呈现在一行中,这些元组很难阅读。所以我所做的就是将它们复制到我的编辑器中,将单行分割成多行,并且比自动缩进(emacs确实非常棒,而且一些编辑可以遵循Erlang的类似lisp的注记)。

+0

这确实奇迹!非常感谢您的帮助和解释! – 2014-10-04 18:45:51