gpt4 book ai didi

erlang - fun2ms应该改造吗?

转载 作者:行者123 更新时间:2023-12-02 05:47:19 25 4
gpt4 key购买 nike

跟随LYSE书中关于Mnesia的章节中,作者提供了使用fun2ms的查询。由于某种原因,这给了我一个错误:

$ rebar3 ct
[0;32m===> Verifying dependencies...
[0m[0;32m===> Compiling mafiapp
[0m[0;32m===> Running Common Test suites...
[0m%%% mafiapp_SUITE ==> add_service: [0;32mOK[0m[0m

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mnesia:wrap_trans failed on line 399
Reason: aborted
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

%%% mafiapp_SUITE ==> friend_by_name: [0;31mFAILED[0m[0m
%%% mafiapp_SUITE ==> [0;31m{failed,{aborted,{badarg,{ets,fun2ms,
[function,called,with,real,'fun',should,be,
transformed,with,parse_transform,'or',called,
with,a,'fun',generated,in,the,shell]}}}}[0m[0m

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mnesia:wrap_trans failed on line 399
Reason: aborted
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

%%% mafiapp_SUITE ==> friend_with_services: [0;31mFAILED[0m[0m
%%% mafiapp_SUITE ==> [0;31m{failed,{aborted,{badarg,{ets,fun2ms,
[function,called,with,real,'fun',should,be,
transformed,with,parse_transform,'or',called,
with,a,'fun',generated,in,the,shell]}}}}[0m[0m
Failed 2 tests. Passed 1 tests.
Results written to "d:/Projects/vms/erlang/projects/erlang-patterns/src/examples/mafiapp/_build/test/logs/index.html".
[0;31m===> Failures occured running tests: 2
[0m

请参阅下面的 mafiapp.erl 文件中的 find_services 函数:

-module(mafiapp).

%% API exports
-export([install/1, add_friend/4, add_service/4, friend_by_name/1]).

%% Records
-record(mafiapp_friends, {name,
contact=[],
info=[],
expertise}).
-record(mafiapp_services, {from,
to,
date,
description}).

%%====================================================================
%% API
%%====================================================================
add_friend(Name, Contact, Info, Expertise) ->
F = fun() ->
mnesia:write(#mafiapp_friends{name=Name, contact=Contact, info=Info, expertise=Expertise})
end,
mnesia:activity(transaction, F).

add_service(From, To, Date, Description) ->
F = fun() ->
case mnesia:read({mafiapp_friends, From}) =:= [] orelse
mnesia:read({mafiapp_friends, To}) =:= [] of
true -> {error, unknown_friend};
false -> mnesia:write(#mafiapp_services{from=From, to=To, date=Date, description=Description})
end
end,
mnesia:activity(transaction, F).

friend_by_name(Name) ->
F = fun() ->
case mnesia:read({mafiapp_friends, Name}) of
[#mafiapp_friends{contact=C, info=I, expertise=E}] ->
{Name,C,I,E,find_services(Name)};
[] -> undefined
end
end,
mnesia:activity(transaction, F).

install(Nodes) ->
ok = mnesia:create_schema(Nodes),
rpc:multicall(Nodes, application, start, [mnesia]),
mnesia:create_table(mafiapp_friends,
[{attributes, record_info(fields, mafiapp_friends)},
{index, [#mafiapp_friends.expertise]},
{disc_copies, Nodes}]),
mnesia:create_table(mafiapp_services,
[{attributes, record_info(fields, mafiapp_services)},
{index, [#mafiapp_services.to]},
{disc_copies, Nodes},
{type, bag}]),
rpc:multicall(Nodes, application, stop, [mnesia]).

%% Private functions
find_services(Name) ->
Match = ets:fun2ms(
fun(#mafiapp_services{from=From, to=To, date=D, description=Desc})
when From =:= Name ->
{to, To, D, Desc};
(#mafiapp_services{from=From, to=To, date=D, description=Desc})
when To =:= Name ->
{from, From, D, Desc}
end
),
mnesia:select(mafiapp_services, Match).

请帮忙。

最佳答案

您必须将 ms_transform 解析转换插入模块中才能使 ets:fun2ms 工作。

-include_lib("stdlib/include/ms_transform.hrl").

参见ets:fun2ms/1文档以获取更多详细信息。

关于erlang - fun2ms应该改造吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36019309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com