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=<了解更多详细信息

  • 开头的两行