2016-06-22 12 views
3

Ist es möglich? Wenn das so ist, wie?Wie heißt man: ets.fun2ms im Elixier?

Der folgende Code wird in einem IEX ausgeführt.

Der kompilierte Code generiert jedoch einen Laufzeitfehler.

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

Der Fehler kommt so heraus: Ich möchte wissen, wie man richtig anruft.

** (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 
+0

Was passiert, was Sie nicht erwarten? – Taegost

Antwort

3

Nein, das geht nicht. Zumindest nicht mit "echten Funktionen" wie der Fehler sagt. Elixir-Funktionen sind ein wenig anders als die Funktionen in Erlang definiert und deshalb funktioniert diese Funktion nicht. Glücklicherweise können Sie das gleiche mit diesem Repository https://github.com/ericmj/ex2ms

erreichen Wie es in der Readme angegeben:

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} 

Das Makro Ex2ms.fun/1 macht das gleiche wie ets:fun2ms/1.

Ich hoffe, das hilft.