1

Logan/Merritt/Carlson の単純なキャッシュ、Chapter 6、pp 149-169、Erlang and OTP in Action に若干の変更を加えています。これまでのところ、モジュールの名前を変更するだけで、コードの変更はありません。

アプリケーションを開始します。

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_server (Logan などの sc_element) です。 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 関数です。

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}

だから今、私は当惑しています。私は何が欠けていますか?Supervisor:start_child/2 がエラーをスローするのはなぜですか?

ありがとう、

LRP

4

1 に答える 1

1

{blop,86400}このエラーは、2 つのメンバーのリストを期待しているように見えるときに、2 つのメンバーを持つタプルを渡していることを示しています: [Value, LeaseTime]。直接実行では、リストも使用しているため、機能します。タプルが作成されている場所を把握し、代わりにリストを作成する必要があります。

于 2013-06-05T21:18:33.563 に答える