2015-02-01 3 views
13

mam prosty moduł zawierający pojedynczą funkcję:Jak mogę wywołać funkcję modułu w Enum.map bez uzyskania błędu "Nieokreślony odnośnik"?

defmodule Funcs do 

    def double(x) do 
    x*2 
    end 

end 

Kiedy zacznę iex z nazwy pliku jako argumentu, mogę wywołać funkcję dobrze:

iex(5)> Funcs.double(3) 
6 

Ale gdy próbuję używać go w Enum.map, otrzymuję błąd: undefined function

iex(2)> Enum.map([1,2,3,4], Funcs.double) 
** (UndefinedFunctionError) undefined function: Funcs.double/0 
    Funcs.double() 

natomiast jeśli po prostu użyć analogowego ou funkcja anonimowa, wszystko działa zgodnie z oczekiwaniami:

iex(6)> Enum.map([1,2,3,4], fn(x) -> x*2; end) 
[2, 4, 6, 8] 

Jak mogę użyć funkcji modułu (pewien, czy to jest prawidłowe określenie) jako argument do Enum.map?

+1

Dodałem link do dokumentów dla '&' formularza specjalnego do mojej odpowiedzi, przepraszam, że nie wcześniej, ale byłem na telefonie komórkowym. – whatyouhide

+0

Idealne, wielkie dzięki. –

Odpowiedz

22

Składnia do przechwytywania funkcji nieanonimowych używa &function/arity.

W przykładzie:

Enum.map([1,2,3,4], &Funcs.double/1) 

można przeczytać więcej na temat składni przechwytywania (co jest bardzo powszechne w Elixir) w the docs for the & special form.

Powiązane problemy