4

出来ますか?もしそうなら、どのように?

次のコードは IEX で実行されます。

ただし、コンパイルされたコードは実行時エラーを生成します。

 :ets.fun2ms(fn({a,b}) -> a and b end)

エラーは次のようになります。適切に呼び出す方法を知りたいです。

** (exit) exited in: :ets.fun2ms(:function, :called, :with, :real, :fun, :should, :be, :transformed, :with, :parse_transform, :or, :called, :with, :a, :fun, :generated, :in, :the, :shell)
     ** (EXIT) :badarg
 stacktrace:
   (stdlib) ets.erl:554: :ets.fun2ms/1
   test/game/ets_lookup_test.exs:27
4

1 に答える 1

5

いいえ、できません。エラーが言うように、少なくとも「実際の関数」ではありません。Elixir 関数は、Erlang の関数とは少し異なって定義されているため、この関数は機能しません。幸いなことに、このリポジトリhttps://github.com/ericmj/ex2msを使用して同じことを達成できます。

READMEに記載されているとおり:

iex(1)> import Ex2ms
iex(2)> fun do { x, y } = z when x > 10 -> z end
[{{:"$1",:"$2"},[{:>,:"$1",10}],[:"$_"]}]
iex(3)> :ets.test_ms({ 42, 43 }, v(2))
{:ok,{42,43}}
iex(4)> :ets.test_ms({ 0, 10 }, v(2))
{:ok,false}

マクロEx2ms.fun/1は と同じことを行いets:fun2ms/1ます。

これが役立つことを願っています。

于 2016-06-22T16:41:21.033 に答える