gpt4 book ai didi

erlang:用实数 'fun' 调用的函数应该用 parse_transform 转换吗?

转载 作者:行者123 更新时间:2023-12-04 06:20:23 25 4
gpt4 key购买 nike

我正在看 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) 会换行?)

无论如何,我已经放弃了选择而支持 ets:foldl,因为后者可以工作,并且 - 通过乐趣中的异常 - 允许我在找到第一个项目时终止遍历。但是,我还是很好奇……

...世界卫生大会? (我在 parse_transform 上做了一些阅读,而且我对 erlang 还不够熟悉,我错过了连接。)

最佳答案

badarg异常是使用错误参数调用的内置函数(或伪函数,如本例)的症状。在这种情况下,ets:fun2ms/1功能。

阅读自 the official documentation :

fun2ms(LiteralFun) -> MatchSpec

Pseudo function that by means of a parse_transform translates LiteralFun typed as parameter in the function call to a match_spec. With "literal" is meant that the fun needs to textually be written as the parameter of the function, it cannot be held in a variable which in turn is passed to the function).

关于erlang:用实数 'fun' 调用的函数应该用 parse_transform 转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655064/

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