2

現在、Erlang のコーディングを学んでいます。Chicago Boss の上に Web アプリケーションがあります。Todo というモデルがあり、REST API として CRUD 操作を提供したいと考えています。

私の PUT メソッドには、次のコードがあります。

index('PUT', [Id]) ->
    Todo = boss_db:find(Id),
    Body = element(2, mochijson:decode(Req:request_body())),
    %% Set the new values
    NewTodo = Todo:attributes([
            {subject, proplists:get_value("subject", Body)},
            {done, proplists:get_value("done", Body)}
        ])
,
    {json, [{todo, element(2, NewTodo:save())}]}.

このコード フラグメントを最適化するにはどうすればよいですか? それとも、これはすでに可能な限り最高ですか?

プロップリストのキーをアトムキーに変更する「よりスマートな」方法はありますか? このような:

[{"subject", "Foo"}] -> [{subject, "Foo"}].

また、Todo 変数を割り当ててから NewTodo を作成するのは、ちょっと面倒だと思います。悲しいことに、チェックアウトできる github で Erlang Chicago Boss アプリの良い例を見つけることができません。

4

3 に答える 3

1

あなたはいつでもこのようなことをすることができます:

t([{"subject", V}|T]) -> [{subject, V}|t(T)];
t([{"done"   , V}|T]) -> [{done,    V}|t(T)];
t([_             |T]) ->               t(T) ; % optional garbage ignoring clause
t([])                 -> [].

しかし、私はあなたの場合、それが大幅な速度の向上になるとは思えません。

これから最後のビットを絞ることができるかもしれません:

-compile({inline, [t/1]}).
t(L) -> t(L, []).

t([{"subject", V}|T], A) -> t(T, [{subject, V}|A]);
t([{"done"   , V}|T], A) -> t(T, [{done,    V}|A]);
t([_             |T], A) -> t(T, A); % optional garbage ignoring clause
t([], A)                 -> A.

これはベンチマークコードの競争にのみ価値があります;-)(lists:reverse/1最後の節には呼び出しがないことに注意してください。以前のバージョンからの改善を台無しにするでしょう。)

PS:私がマイクロ最適化フリークだと思うなら、あなたは正しいので、BIFを直接使用するためにlists:reverse/1呼び出しを置き換えて、もう少し時間を節約します;-)lists:reverse/2

于 2011-10-25T09:57:22.237 に答える
0

残念ながら、Hynekの答えについてコメントすることはできませんが、Erlangの初心者として、私の最初の推測は、次のようなものを探すことでした。

lists:map(fun({A, B}) -> {list_to_atom(A), B} end, [X || {Y, Z}=X <- List, is_list(Y)]).

NewTodoの割り当てを本当に回避することはできません

于 2012-12-26T04:42:50.003 に答える
0

どうですか

index('PUT', [Id]) ->
    Body = element(2, mochijson:decode(Req:request_body())),
    OldTodo = boss_db:find(Id),
    NewTodo = OldTodo:attributes([ {list_to_atom(A),B} || {A,B}<-Body ]),
    {json, [{todo, element(2, NewTodo:save())}]}.
于 2012-12-26T04:57:37.313 に答える