2014-10-04 285 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