Я смотрю на книгу по программированию на O'Reilly Erlang, и есть пример, который запускается в оболочке erlang, который выглядит следующим образом:
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]]
Однако, когда я делаю что-то подобное в своем коде(не в оболочке):
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) будет переносить строки?)
В любом случае, я отказался от выбора в пользу ets: foldl, так как последний работает и - через исключения в забаве -позволяет мне прекратить обход, когда первый элемент найден.Но мне все еще интересно ...
... а?(Я немного читал в parse_transform, и я достаточно новичок, чтобы ошибиться, что мне не хватает соединения.)