Elixir聊天室项目gen_tcp接收模块CaseClauseError问题求助
问题分析与解决:CaseClauseError 匹配 :ok 失败
核心问题出在你的recv/1函数返回值上:它没有返回你预期的{:ok, username}或{:error}元组,而是返回了:ok原子,这直接导致handle_client/1中的case没有匹配分支,抛出错误。
原因详解
Elixir函数默认返回最后一行表达式的结果。看你的recv/1代码:
defp recv(socket) do Logger.info("recv: on listen to client 1") case :gen_tcp.recv(socket, 0) do {:ok, data} -> {:ok, String.trim(data)} {:error, _reason} -> {:error} end Logger.info("recv: on listen to client 2") # 这行是函数最后执行的表达式 end
case块执行完后,后续的Logger.info("recv: on listen to client 2")会被执行,而Logger.info/1的返回值固定是:ok,所以整个recv/1函数最终返回的是:ok,而非case块里的元组,自然无法匹配handle_client/1中{:ok, username}或{:error}的分支。
修复方案
调整代码结构,让case块成为recv/1的最后一行表达式,确保返回预期的元组:
defp recv(socket) do Logger.info("recv: on listen to client 1") case :gen_tcp.recv(socket, 0) do {:ok, data} -> Logger.info("recv: on listen to client 2") {:ok, String.trim(data)} {:error, _reason} -> Logger.info("recv: on listen to client 2") {:error} end end
这样case块的结果就是整个函数的返回值,handle_client/1就能正确匹配到对应的分支。
内容的提问来源于stack exchange,提问作者zhy21345
相关产品推荐
相关产品推荐

