Erlang:supervisor:start\u child/2错误让我感到困惑

Erlang:supervisor:start\u child/2错误让我感到困惑,erlang,otp,erlang-supervisor,gen-server,Erlang,Otp,Erlang Supervisor,Gen Server,我正在对Logan/Merritt/Carlson的《简单缓存》第6章第149-169页的《Erlang和OTP在运行》进行轻微修改。到目前为止,没有代码更改,只是重命名了模块 我启动应用程序: application:start(gridz). ok 我插入一个项目: gridz_maker:insert(blip, blop). 我得到这个错误: ** exception error: no match of right hand side value

我正在对Logan/Merritt/Carlson的《简单缓存》第6章第149-169页的《Erlang和OTP在运行》进行轻微修改。到目前为止,没有代码更改,只是重命名了模块

我启动应用程序:

application:start(gridz).
ok
我插入一个项目:

gridz_maker:insert(blip, blop).
我得到这个错误:

** exception error: no match of right hand side value 
                {error,
                    {function_clause,
                        [{gridz_edit,init,
                             [{blop,86400}],
                             [{file,"src/gridz_edit.erl"},{line,51}]},
                         {gen_server,init_it,6,
                             [{file,"gen_server.erl"},{line,304}]},
                         {proc_lib,init_p_do_apply,3,
                             [{file,"proc_lib.erl"},{line,227}]}]}}
 in function  gridz_maker:insert/2 (src/gridz_maker.erl, line 15)
代码如下:

insert(Key, Value) ->
   case gridz_store:lookup(Key) of
      {ok, Pid}  -> gridz_edit:replace(Pid, Value);
      {error, _} -> {ok, Pid} = gridz_edit:create(Value),   %% line 15
                    gridz_store:insert(Key, Pid)
   end.
我看第15行:

  {error, _} -> {ok, Pid} = gridz_edit:create(Value),
我预计会出现错误,因为这是一个新项目。gridz:edit是一个gen_服务器(Logan等人的sc_元素)。下面是create/1的代码:

create(Value) ->
  create(Value, ?DEFAULT_LEASE_TIME).

create(Value, LeaseTime) ->
   gridz_sup:start_child(Value, LeaseTime).
下面是gridz_sup:start_child/2的代码:

start_child(Value, LeaseTime) ->
   supervisor:start_child(?SERVER, [Value, LeaseTime]).

init([]) ->
   Grid            = {gridz_edit, {gridz_edit, start_link, []},
                     temporary, brutal_kill, worker, [gridz_edit]},
   Children        =  [Grid],
   RestartStrategy = {simple_one_for_one, 0, 1},
                     {ok, {RestartStrategy, Children}}.
如果我直接执行supervisor:start_child/2,我会得到以下结果:

{error,{function_clause,[{gridz_edit,init,
                                 [{blop,50400}],
                                 [{file,"src/gridz_edit.erl"},{line,51}]},
                     {gen_server,init_it,6,
                                 [{file,"gen_server.erl"},{line,304}]},
                     {proc_lib,init_p_do_apply,3,
                               [{file,"proc_lib.erl"},{line,227}]}]}}
gridz_edit中的第51行是一个初始化函数:

init([Value, LeaseTime]) ->
   Now = calendar:local_time(),
   StartTime = calendar:datetime_to_gregorian_seconds(Now),
   {ok,
   #state{value = Value,
          lease_time = LeaseTime,
          start_time = StartTime},
   time_left(StartTime, LeaseTime)}.
如果我直接执行它,它会工作:

120> gridz_edit:init([blop, (60 * 60 * 24)]).
{ok,{state,blop,86400,63537666408},86400000}
所以现在我很困惑。我错过了什么?为什么主管:启动\u child/2抛出错误

谢谢


LRP

错误表示您正在传入一个包含两个成员的元组,
{blop,86400}
,而您似乎希望得到一个包含两个成员的列表:
[Value,LeaseTime]
。在直接执行中,您还使用了一个列表,因此它是有效的。您应该找出创建元组的位置,然后创建一个列表。

错误表示您正在传入一个包含两个成员的元组,
{blop,86400}
,而您似乎希望得到一个包含两个成员的列表:
[Value,LeaseTime]
。在直接执行中,您还使用了一个列表,因此它是有效的。你应该找出元组的创建位置,然后创建一个列表。

啊,我的老眼睛和小字体。你把它钉住了。我在gridz_edit:start_link/2中有一个元组,当时我应该有一个列表。没问题,很乐意帮忙。啊,我的老眼睛和精美的印刷品。你把它钉住了。我在gridz_edit:start_link/2中有一个元组,当时我应该有一个列表。没问题,很乐意帮助。