2

私はO'ReillyErlangプログラミングの本を見ていますが、次のような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を支持してselectを放棄しました。後者は機能し、楽しみの例外を介して、最初のアイテムが見つかったときにトラバーサルを終了できるためです。しかし、私はまだ興味があります...

...なに?(私はparse_transformでいくつかの読み取りを行いましたが、接続が欠落していることをerlangするのに十分な新人です。)

4

1 に答える 1

3

badarg例外は、間違ったパラメーターで呼び出された組み込み関数(またはこの場合は疑似関数)の症状です。この場合、ets:fun2ms/1関数。

公式ドキュメントから読む:

fun2ms(LiteralFun)-> MatchSpec

parse_transformを使用して、関数呼び出しでパラメーターとして入力されたLiteralFunをmatch_specに変換する疑似関数。「リテラル」とは、関数のパラメーターとしてfunをテキストで記述する必要があることを意味し、関数に渡される変数に保持することはできません)。

于 2011-07-11T21:27:33.853 に答える