Erlang переменное сопоставление с образцом

У меня есть service_echo Функция в простом приложении чата, которое использует SockJS для реализации многопользовательского приватного чата. Я создал таблицу ETS для списка онлайн-пользователей. Сохраняя сеанс SockJS, я думал об отправке сообщения этому соединению всякий раз, когда получаю сообщение от другого соединения.

Вот мой 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:send(data) отправляет действительные данные в браузер BB:send(Data) ничего не делает и даже не показывает ошибку. Так как я новичок в Erlang, прошу прощения за любые непреднамеренные ошибки.

1 ответ

Прежде всего, позвольте мне посоветовать вам никогда не использовать length(A) =:= 0 для проверки, есть ли список A пусто или нет; если A длинный список с подсчетом его элементов обойдется вам дорого, хотя результат фактически не будет использован. использование A =:= [] вместо этого проще и лучше.

Я не понимаю, почему ты так говоришь Conn а также BB подобные. Это не следует из кода, который вы разместили здесь. Если Name нет в таблице, вы вставляете запись {Name, Conn}, В противном случае, если Name существует в таблице и относится к одному объекту BBПредполагаешь что это BB это модуль, и вы называете send определенная в нем функция.

Возможно, вы неправильно читаете семантику if --- если это так, не позволяйте true Охрана вводит вас в заблуждение, вот как написано "если-то-еще" на Erlang. Может быть, вы хотели что-то вроде:

    ...
    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)
    ...

С другой стороны, может быть, я неправильно понял, что вы пытаетесь сделать. Если это так, пожалуйста, уточните.

Другие вопросы по тегам