sockets - Erlang 变量模式匹配

标签 sockets erlang pattern-matching sockjs

我有一个 service_echo一个简单的聊天应用程序中的函数,它使用 SockJS 实现多用户私有(private)聊天。我为在线用户列表创建了一个 ETS 表。通过存储 SockJS session ,每当我收到来自不同连接的消息时,我想向该连接发送消息。

这是我的service_echo代码。

service_echo(Conn, {recv, Data}, state) ->
    Obj = mochijson2:decode(Data),
    {struct, JsonData} = Obj,
    Name = proplists:get_value(<<"name">>, JsonData),
    A = ets:lookup(username,Name),
    io:format("~p",[Conn]),
    if
      length(A) =:= 0 ->
          ets:insert(username,{Name,Conn});
      true ->
          [{AA,BB}] = ets:lookup(username,Name),

          BB:send(Data)
    end,

     io:format("hello");

即使 Conn 和 BB 相同,仍然 Conn:send(data) BB:send(Data) 时向浏览器发送有效数据什么都不做,甚至不显示错误。
由于我是 Erlang 的新手,请原谅我任何无意的错误。

最佳答案

首先,让我建议你不要使用 length(A) =:= 0用于测试列表 A是否为空;如果 A一个很长的列表,计算它的元素会花费你很多,尽管结果实际上不会被使用。使用A =:= []相反,更简单更好。

我不明白你为什么这么说ConnBB是相同的。这与您在此处发布的代码不同。如果 Name不在表中,您插入一个条目 {Name, Conn} .否则,如果 Name存在于表中并且与单个对象有关BB , 你假设这个 BB是一个模块,您调用 send其中定义的功能。

可能是您读错了 if 的语义。 --- 如果是这样,不要让 true守卫让你感到困惑,这就是用 Erlang 编写 if-then-else 的方式。也许您想要类似的东西:

    ...
    A = ets:lookup(username,Name),
    if
      A =:= [] ->
        ets:insert(username,{Name,Conn})
    end,
    [{_,BB}] = ets:lookup(username,Name),
    BB:send(Data)
    ...

甚至更好:
    ...
    A = ets:lookup(T,Name),
    if
      A =:= [] ->
        ets:insert(T,{Name,Conn}),
        BB = Conn;
      true ->
        [{_,BB}] = A
    end,
    BB:send(Data)
    ...

另一方面,可能是我误解了您要执行的操作。如果是这种情况,请澄清。

关于sockets - Erlang 变量模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18223531/

相关文章:

erlang - 什么是 Erlang 节点?

F#:类型匹配和事件模式

java - socket - Android 客户端 - Java 服务器 PC 卡住

list - 从文件中读取行到 erlang 中的列表,忽略\n

java - 如何正确关闭套接字然后重新打开它?

erlang - 如何从 mnesia 中仅选择 X 条记录

Haskell:为什么模式匹配中不允许使用++?

haskell - 跨度和模式匹配

sockets - 关于 TCP 连接和 TCP 保持事件的查询?

android - 连接到安卓蓝牙 socket