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)
...
С другой стороны, может быть, я неправильно понял, что вы пытаетесь сделать. Если это так, пожалуйста, уточните.