我正在看O'Reilly Erlang Programming书里面有一个在Erlang shell中运行的例子,看起来像这样:
17> MS = ets:fun2ms(fun({Name,Country,Job}) when Job /= cook ->
[Country,Name] end).
[ ....an erlang match expression is returned.... ]
18> ets:select(countries, MS).
[[ireland,sean],[ireland,chris]]
然而,当我在我的代码中做类似的事情时(不是在shell中):
Fun = fun({Type,_,_,ObjectId,PlayerId}) when Type==player_atom, PlayerId==2 -> ObjectId end,
MatchFun = ets:fun2ms(Fun),
PlayerObjectId = ets:select(?roster_table, MatchFun),
得到FUBAR:
exit:{badarg,{ets,fun2ms,[function,called,with,real,'fun',should,be,transformed,with,parse_transform,'or',called,with,a,'fun',generated,in,the,shell]}}
(顺便说一句,我想知道为什么错误不是'函数调用....'可能如此io:format("~p", TheErrorMessage)将行换行?)
无论如何,我放弃了select而选择了ets:foldl,因为后者可以工作,并且通过异常允许我在找到第一个项时终止遍历。但是,我还是很好奇………世界卫生大会?(我在parse_transform上做了一些阅读,我是erlang的新手,所以我错过了连接。)
badarg
异常是使用错误参数调用内置函数(或本例中的伪函数)的症状。本例中为ets:fun2ms/1
函数。
阅读官方文档:
fun2ms(LiteralFun) -> MatchSpec
伪函数,通过parse_transform进行翻译LiteralFun在match_spec的函数调用中作为参数键入。"字面意思"是指乐趣需要以文字形式呈现函数的形参不能保存在变量中依次传递给函数)。