Erlang I';m获取列表的函数\u子句:n/2函数

Erlang I';m获取列表的函数\u子句:n/2函数,erlang,Erlang,我对这个代码有一些问题,这真的很奇怪,也许有人可以告诉我发生了什么: suggested_system_actor_data_for_hookup(RealActorId, RealActorName, RealActorLang, SuggestedUsers = [_|_]) -> case length(SuggestedUsers) > 0 of true -> SuggestedUserIndexRedisKey = "real_actor."

我对这个代码有一些问题,这真的很奇怪,也许有人可以告诉我发生了什么:

suggested_system_actor_data_for_hookup(RealActorId, RealActorName, RealActorLang, SuggestedUsers = [_|_]) ->
  case length(SuggestedUsers) > 0 of
    true ->
      SuggestedUserIndexRedisKey = "real_actor." ++ helper:convert_value_to_list(RealActorId) ++ "." ++
        helper:convert_value_to_list(RealActorLang) ++ ".hookup.suggested_user_index",
      NextIndex = next_index(SuggestedUserIndexRedisKey, SuggestedUsers),

      case NextIndex of
        not_found -> not_found;
        NextIndex ->
          case is_list(SuggestedUsers) of
            true ->
              Item = lists:nth(NextIndex, SuggestedUsers), % <--- throws error %
              SystemActorId = helper:convert_value_to_list(ej:get({"user_id"}, Item)),
              SystemActorSiteId = helper:convert_value_to_list(ej:get({"site_id"}, Item)),

              case helper:has_redis_key_last_visit_timestamp(RealActorId, SystemActorId) of
                {ok, no} ->
                  ?MODULE:send_visit_and_sleep(RealActorName, RealActorId, SystemActorId),
                  {SystemActorId, SystemActorSiteId};
                {ok, _LastVisitTimestamp} -> {SystemActorId, SystemActorSiteId}
              end;
            false ->
              helper:log_error("SuggestedUsers is not a list = " ++ helper:convert_value_to_list(SuggestedUsers), ?LINE, ?MODULE),
            not_found
          end
      end;
    false -> not_found
  end;
suggested_system_actor_data_for_hookup(_RealActorId, _RealActorName, _RealActorLang, _SuggestedUsers = []) ->
  not_found.
连接的建议系统参与者数据(RealActorId、RealActorName、RealActorLang、SuggestedUsers=[\u124; 124;]->
案例长度(建议用户)>0个
正确->
SuggestedUserIndexRedisKey=“real\u actor.++helper:将\u值\u转换为\u列表(RealActorId)+”++
帮助程序:将\u值\u转换为\u列表(RealActorLang)+“。连接。建议的\u用户\u索引“,
NextIndex=下一个索引(SuggestedUserIndexRedisKey,SuggestedUsers),
案例NextIndex
未找到->未找到;
下一个索引->
案例列表(建议用户)
正确->
项目=列表:第n个(下一个索引,建议用户),%
?模块:发送访问和睡眠(RealActorName、RealActorId、SystemActorId),
{SystemActorId,systemactorsteid};
{好的,{u lastVisitItemsTamp}->{SystemActorId,SystemActorSteid}
结束;
错误->
helper:log_error(“SuggestedUsers不是列表=“++helper:convert_value_to_list(SuggestedUsers)”、?行、?模块),
找不到
结束
结束;
false->未找到
结束;
建议的连接系统参与者数据(\u RealActorId,\u RealActorName,\u RealActorLang,\u SuggestedUsers=[])->
没有找到。
在第194行:Item=lists:nth(NextIndex,SuggestedUsers)处,正在日志中抛出错误,我不知道为什么

=ERROR REPORT==== 4-Jul-2018::20:50:47 ===^M
Error in process <0.31747.0> on node 'animate_online_real_actors@online.anim.int' with exit value:^M
{function_clause,^M
    [{lists,nth,[1,[]],[{file,"lists.erl"},{line,170}]},^M
     {hookup,suggested_system_actor_data_for_hookup,4,^M
         [{file,^M
              "/projects/animate_online_real_actors/animate_online_real_actors/_build/prod/lib/animate_online_real_actors/src/hookup.erl"},^M
          {line,194}]},^M
     {hookup,send_hookup_with_verification_of_suggested_system_actor,12,^M
         [{file,^M
              "/projects/animate_online_real_actors/animate_online_real_actors/_build/prod/lib/animate_online_real_actors/src/hookup.erl"},^M
          {line,81}]},^M
     {hookup,process_hookup,3,^M
         [{file,^M
              "/projects/animate_online_real_actors/animate_online_real_actors/_build/prod/lib/animate_online_real_actors/src/hookup.erl"},^M
...etc
=错误报告===2018年7月4日::20:50:47====^M
节点“在线动画”处理中出错_actors@online.anim.int'的退出值:^M
{function_子句,^M
[{lists,n[1,[]],[{file,“lists.erl”},{line,170}]},^M
{连接,建议连接的系统参与者数据,4,^M
[{文件,^M
“/projects/animate\u online\u real\u actors/animate\u online\u real\u actors/\u build/prod/lib/animate\u online\u real\u actors/src/hookup.erl”},^M
{line,194}]},^M
{连接,发送带有建议系统参与者验证的连接,12,^M
[{文件,^M
“/projects/animate\u online\u real\u actors/animate\u online\u real\u actors/\u build/prod/lib/animate\u online\u real\u actors/src/hookup.erl”},^M
{line,81}]},^M
{连接,进程{u连接,3,^M
[{文件,^M
“/projects/animate\u online\u real\u actors/animate\u online\u real\u actors/\u build/prod/lib/animate\u online\u real\u actors/src/hookup.erl”},^M
等

代码段中有许多无用的代码。由于在函数头中使用了模式匹配
SuggestedUsers=[| |]
,您知道SuggestedUsers是一个非空列表,因此
长度(SuggestedUsers)>0
始终为真,与
是列表(SuggestedUsers)
相同

关于错误,只有两个可能的原因:

  • NextIndex不是大于0的整数
  • NextIndex大于长度(建议用户)
错误报告显示NextIndex=length(SuggestedUsers)+1

我认为您可以通过以下方式简化函数:

suggested_system_actor_data_for_hookup(RealActorId, RealActorName, RealActorLang, SuggestedUsers = [_|_]) ->
  SuggestedUserIndexRedisKey = "real_actor." ++ helper:convert_value_to_list(RealActorId) ++ "." ++
    helper:convert_value_to_list(RealActorLang) ++ ".hookup.suggested_user_index",
  NextIndex = next_index(SuggestedUserIndexRedisKey, SuggestedUsers),

  case (NextIndex > 0) and (NextIndex =< length(SuggestedUsers)) of
  % an atom is bigger than any integer, so the test covers the case NextIndex == not_found 
    false -> not_found;
    true ->
      Item = lists:nth(NextIndex, SuggestedUsers),
      SystemActorId = helper:convert_value_to_list(ej:get({"user_id"}, Item)),
      SystemActorSiteId = helper:convert_value_to_list(ej:get({"site_id"}, Item)),
      {ok,Answer} = helper:has_redis_key_last_visit_timestamp(RealActorId, SystemActorId),
      maybe_send_visit_and_sleep(Answer,RealActorName, RealActorId, SystemActorId);
      {SystemActorId, SystemActorSiteId}
    end;
suggested_system_actor_data_for_hookup(_RealActorId, _RealActorName, _RealActorLang, _SuggestedUsers = []) ->
  not_found.

maybe_send_visit_and_sleep(no,RealActorName, RealActorId, SystemActorId) ->
  send_visit_and_sleep(RealActorName, RealActorId, SystemActorId);
maybe_send_visit_and_sleep(_,_,_,_) ->
  ok.
连接的建议系统参与者数据(RealActorId、RealActorName、RealActorLang、SuggestedUsers=[\u124; 124;]->
SuggestedUserIndexRedisKey=“real\u actor.++helper:将\u值\u转换为\u列表(RealActorId)+”++
帮助程序:将\u值\u转换为\u列表(RealActorLang)+“。连接。建议的\u用户\u索引“,
NextIndex=下一个索引(SuggestedUserIndexRedisKey,SuggestedUsers),
案例(NextIndex>0)和(NextIndex=未找到;
正确->
项目=列表:第n个(下一个索引,建议用户),
SystemActorId=helper:convert_value_to_list(ej:get({“user_id”},Item)),
systemactorsteid=helper:convert_value_to_list(ej:get({“site_id”},Item)),
{ok,Answer}=helper:has_redis_key_last_visit_timestamp(RealActorId,systemactrid),
可能会发送访问和睡眠(应答、RealActorName、RealActorId、SystemActorId);
{SystemActorId,systemactorsteid}
结束;
建议的连接系统参与者数据(\u RealActorId,\u RealActorName,\u RealActorLang,\u SuggestedUsers=[])->
没有找到。
可能会发送访问和睡眠(否,RealActorName,RealActorId,SystemActorId)->
发送访问和睡眠(RealActorName、RealActorId、SystemActorId);
也许你会去探望你,然后睡觉(,,,,,)->
好啊

代码段中有许多无用的代码。由于在函数头中使用了模式匹配
SuggestedUsers=[| |]
,您知道SuggestedUsers是一个非空列表,因此
长度(SuggestedUsers)>0
始终为真,与
是列表(SuggestedUsers)
相同

关于错误,只有两个可能的原因:

  • NextIndex不是大于0的整数
  • NextIndex大于长度(建议用户)
错误报告显示NextIndex=length(SuggestedUsers)+1

我认为您可以通过以下方式简化函数:

suggested_system_actor_data_for_hookup(RealActorId, RealActorName, RealActorLang, SuggestedUsers = [_|_]) ->
  SuggestedUserIndexRedisKey = "real_actor." ++ helper:convert_value_to_list(RealActorId) ++ "." ++
    helper:convert_value_to_list(RealActorLang) ++ ".hookup.suggested_user_index",
  NextIndex = next_index(SuggestedUserIndexRedisKey, SuggestedUsers),

  case (NextIndex > 0) and (NextIndex =< length(SuggestedUsers)) of
  % an atom is bigger than any integer, so the test covers the case NextIndex == not_found 
    false -> not_found;
    true ->
      Item = lists:nth(NextIndex, SuggestedUsers),
      SystemActorId = helper:convert_value_to_list(ej:get({"user_id"}, Item)),
      SystemActorSiteId = helper:convert_value_to_list(ej:get({"site_id"}, Item)),
      {ok,Answer} = helper:has_redis_key_last_visit_timestamp(RealActorId, SystemActorId),
      maybe_send_visit_and_sleep(Answer,RealActorName, RealActorId, SystemActorId);
      {SystemActorId, SystemActorSiteId}
    end;
suggested_system_actor_data_for_hookup(_RealActorId, _RealActorName, _RealActorLang, _SuggestedUsers = []) ->
  not_found.

maybe_send_visit_and_sleep(no,RealActorName, RealActorId, SystemActorId) ->
  send_visit_and_sleep(RealActorName, RealActorId, SystemActorId);
maybe_send_visit_and_sleep(_,_,_,_) ->
  ok.
连接的建议系统参与者数据(RealActorId、RealActorName、RealActorLang、SuggestedUsers=[\u124; 124;]->
SuggestedUserIndexRedisKey=“real\u actor.++helper:将\u值\u转换为\u列表(RealActorId)+”++
帮助程序:将\u值\u转换为\u列表(RealActorLang)+“。连接。建议的\u用户\u索引“,
NextIndex=下一个索引(SuggestedUserIndexRedisKey,SuggestedUsers),
案例(NextIndex>0)和(NextIndex=未找到;
正确->
项目=列表:第n个(下一个索引,建议用户),
SystemActorId=helper:convert_value_to_list(ej:get({“user_id”},Item)),
systemactorsteid=helper:convert_value_to_list(ej:get({“site_id”},Item)),
{ok,Answer}=helper:has_redis_key_last_visit_timestamp(RealActorId,systemactrid),
可能会发送访问和睡眠(应答、RealActorName、RealActorId、SystemActorId);
{SystemActorId,systemactorsteid}
结束;
建议的系统参与者数据