List 巴达格至'++';接线员-怎么过来? **终止原因= **{badarg,[{erlang,'+',[,'']}, {geoloc,到附近去,1},
方法是:List 巴达格至'++';接线员-怎么过来? **终止原因= **{badarg,[{erlang,'+',[,'']}, {geoloc,到附近去,1},,list,erlang,arguments,operators,List,Erlang,Arguments,Operators,方法是: ** Reason for termination = ** {badarg,[{erlang,'++',[<<>>,"</after></set></query></iq>"]}, {geoloc,get_nearby,1}, get_near({Pid,DynVars})-> %Last=ts_dynvars:查找(Last,dynvars), Last=列表:键搜索(Last,1,D
** Reason for termination =
** {badarg,[{erlang,'++',[<<>>,"</after></set></query></iq>"]},
{geoloc,get_nearby,1},
get_near({Pid,DynVars})->
%Last=ts_dynvars:查找(Last,dynvars),
Last=列表:键搜索(Last,1,DynVars),
{ok,Rad}=ts_dynvars:lookup(Rad,dynvars),
{ok,Lat}=ts_dynvars:lookup(Lat,dynvars),
{ok,Lon}=ts_dynvars:lookup(Lon,dynvars),
如果是元组(最后一个)->
{value,{Key,After}}=Last,
如果长度(后)==0->
After2=“0”;
正确->
后2=后
完,,
++Lat++++++++Lon++++++++Rad+++++++整数到整数列表(ran_max())+++++++++After2++;
true->%Last是布尔值,即“false”原子
t_dynvars:set([rad,lat,lon],[rad,lat,lon],dynvars),
++Lat++++++++Lon++++++++Rad+++++++++整数到整数列表(ran_max())++
结束。
您试图连接二进制(
)和字符串,但++
只能连接两个字符串(或列表-Erlang字符串实际上是列表)
这意味着After2
是一个二进制,因此它在if
表达式的第二个子句中接收到这个值。通常调用length(After)
当之后不是一个列表时,会导致badarg
异常,但当它出现在测试中时,如果测试被视为保护测试,异常被忽略,因此长度(之后)==0
被视为false。因此,当您在DynVars
中获得相应的值时,它已经是二进制的了
一些建议:
- 要检查列表是否为空,在列表上调用
length
有些浪费,因为length
需要遍历整个列表。请编写如下内容:
get_nearby({_Pid, DynVars})->
%Last = ts_dynvars:lookup(last, DynVars),
Last = lists:keysearch(last,1,DynVars),
{ok, Rad} = ts_dynvars:lookup(rad,DynVars),
{ok, Lat} = ts_dynvars:lookup(lat,DynVars),
{ok, Lon} = ts_dynvars:lookup(lon,DynVars),
if is_tuple(Last) ->
{value,{Key,After}} = Last,
if length(After) == 0 ->
After2 = "0";
true ->
After2 = After
end,
"<iq id=\"" ++ common:get_random_string(5,"abcdefghijklmnopqrstuvwxyz0123456789-+=") ++ "\" xmlns=\"http://xmpp.xgate.com.hk/plugins\" to=\"xmpp.xgate.hk.com\" type=\"get\"><query xmlns=\"jabber:iq:geoloc\"><geoloc><lat>" ++ Lat ++ "</lat><lon>" ++ Lon ++ "</lon><radius>" ++ Rad ++ "</radius></geoloc><set xmlns=\"http://jabber.org/protocol/rsm\"><max>" ++ integer_to_list(ran_max()) ++ "</max><after>" ++ After2 ++ "</after></set></query></iq>";
true -> % Last is boolean, namely the 'false' atom
ts_dynvars:set([rad, lat, lon], [Rad, Lat, Lon], DynVars),
"<iq id=\"" ++ common:get_random_string(5,"abcdefghijklmnopqrstuvwxyz0123456789-+=") ++ "\" xmlns=\"http://xmpp.xgate.com.hk/plugins\" to=\"xmpp.xgate.hk.com\" type=\"get\"><query xmlns=\"jabber:iq:geoloc\"><geoloc><lat>" ++ Lat ++ "</lat><lon>" ++ Lon ++ "</lon><radius>" ++ Rad ++ "</radius></geoloc><set xmlns=\"http://jabber.org/protocol/rsm\"><max>" ++ integer_to_list(ran_max()) ++ "</max></set></query></iq>"
end.
[124; 124;]
是一种匹配非空列表的模式。在您的情况下,
之后的值与任何子句都不匹配,您会遇到一个case\u子句
错误,告诉您实际得到的值
当然,如果您实际希望在这里使用二进制,请检查
和
你在那里做了很多连接(++
),在表达式a++B
中,++
操作符需要遍历a
中的整个列表,因此运行时间与a
的长度成正比
连接有两种常见的替代方法。首先,通常使用结果的函数实际上不需要一个平面列表,但同样可以使用“深度列表”或“iolist”——而不是“foo”+“bar”
,编写[“foo”,“bar”]
。值得注意的是,如果要将结果写入文件或发送到套接字,则file:write
和gen\u tcp:send
都接受这两种变体
其次,您可以使用二进制文件而不是字符串。二进制文件在许多有趣的方面与字符串不同(尤其是它们在垃圾收集方面的行为),但它们确实有一个很好的特性,即它们可以有效地连接起来。如果A
和B
是二进制文件,您可以编写C=<了解更多详细信息
以“开头的两行代码试图连接二进制(
)和字符串,但++
只能连接两个字符串(或列表-Erlang字符串实际上是列表)
这意味着After2
是一个二进制,因此它在if
表达式的第二个子句中接收到这个值。通常调用length(After)
当之后不是一个列表时,会导致badarg
异常,但当它出现在测试中时,如果测试被视为保护测试,异常被忽略,因此长度(之后)==0
被视为false。因此,当您在DynVars
中获得相应的值时,它已经是二进制的了
一些建议:
- 要检查列表是否为空,在列表上调用
length
有些浪费,因为length
需要遍历整个列表。请编写如下内容:
get_nearby({_Pid, DynVars})->
%Last = ts_dynvars:lookup(last, DynVars),
Last = lists:keysearch(last,1,DynVars),
{ok, Rad} = ts_dynvars:lookup(rad,DynVars),
{ok, Lat} = ts_dynvars:lookup(lat,DynVars),
{ok, Lon} = ts_dynvars:lookup(lon,DynVars),
if is_tuple(Last) ->
{value,{Key,After}} = Last,
if length(After) == 0 ->
After2 = "0";
true ->
After2 = After
end,
"<iq id=\"" ++ common:get_random_string(5,"abcdefghijklmnopqrstuvwxyz0123456789-+=") ++ "\" xmlns=\"http://xmpp.xgate.com.hk/plugins\" to=\"xmpp.xgate.hk.com\" type=\"get\"><query xmlns=\"jabber:iq:geoloc\"><geoloc><lat>" ++ Lat ++ "</lat><lon>" ++ Lon ++ "</lon><radius>" ++ Rad ++ "</radius></geoloc><set xmlns=\"http://jabber.org/protocol/rsm\"><max>" ++ integer_to_list(ran_max()) ++ "</max><after>" ++ After2 ++ "</after></set></query></iq>";
true -> % Last is boolean, namely the 'false' atom
ts_dynvars:set([rad, lat, lon], [Rad, Lat, Lon], DynVars),
"<iq id=\"" ++ common:get_random_string(5,"abcdefghijklmnopqrstuvwxyz0123456789-+=") ++ "\" xmlns=\"http://xmpp.xgate.com.hk/plugins\" to=\"xmpp.xgate.hk.com\" type=\"get\"><query xmlns=\"jabber:iq:geoloc\"><geoloc><lat>" ++ Lat ++ "</lat><lon>" ++ Lon ++ "</lon><radius>" ++ Rad ++ "</radius></geoloc><set xmlns=\"http://jabber.org/protocol/rsm\"><max>" ++ integer_to_list(ran_max()) ++ "</max></set></query></iq>"
end.
[124; 124;]
是一种匹配非空列表的模式。在您的情况下,
之后的值与任何子句都不匹配,您会遇到一个case\u子句
错误,告诉您实际得到的值
当然,如果您实际希望在这里使用二进制,请检查
和
你在那里做了很多连接(++
),在表达式a++B
中,++
操作符需要遍历a
中的整个列表,因此运行时间与a
的长度成正比
连接有两种常见的替代方法。首先,通常使用结果的函数实际上不需要一个平面列表,但同样可以使用“深度列表”或“iolist”——而不是“foo”+“bar”
,编写[“foo”,“bar”]
。值得注意的是,如果要将结果写入文件或发送到套接字,则file:write
和gen\u tcp:send
都接受这两种变体
其次,您可以使用二进制文件而不是字符串。二进制文件在许多有趣的方面与字符串不同(尤其是它们在垃圾收集方面的行为),但它们确实有一个很好的特性,即它们可以有效地连接起来。如果A
和B
是二进制文件,您可以编写C=<了解更多详细信息
以开头的两行