Erlang - функция Anonymouos - PullRequest
1 голос
/ 16 июля 2010

Если я вызываю test (), он не работает. Может кто-нибудь объяснить это?

-module(anony).

-export([test/0, test1/0]).

test1() -> "hello".

test() ->
   C = fun(F) -> Val = F(), io:format("~p ", [Val]) end, 
   lists:foreach(debug, [test1]).

Ответы [ 3 ]

7 голосов
/ 16 июля 2010

test1 сам по себе является просто атомом, а не ссылкой на локальную функцию.Чтобы создать ссылку на функцию, используйте fun Function / Arity, как показано ниже.

-module(anony).

-export([test/0, test1/0]).

test1() -> "hello".

test() ->
    C = fun(F) -> Val = F(), io:format("~p ", [Val]) end,
    lists:foreach(C, [fun test1/0]).

Вы также можете создать анонимную функцию, которая вызывает test1 следующим образом: fun() -> test1() end, но нет причин для этого, еслиу вас есть дополнительные значения, которые вы хотите передать или тому подобное.

3 голосов
/ 16 июля 2010

Два других ответа на самом деле отвечают на вопрос. Я просто хочу добавить к ним.

Я ожидаю, что вы захотите передать атом и вызвать функцию с этим именем. Это невозможно для локальных функций. Это очень возможно для экспортируемых функций, хотя.

Таким образом, вы можете сделать что-то вроде (мое единственное изменение - добавить «? MODULE:» и изменить «debug» на «C»):

-module(anony).

-export([test/0, test1/0]).

test1() -> "hello".

test() ->
    C = fun(F) -> Val = ?MODULE:F(), io:format("~p ", [Val]) end, 
    lists:foreach(C, [test1]).
2 голосов
/ 16 июля 2010

Во-первых, переменная C вообще не использовалась, а во-вторых, вам следует обернуть test1 fun/end:

-module(anony).

-export([test/0, test1/0]).

test1() -> "hello".

test() ->
     C = fun(F) -> Val = F(), io:format("~p ", [Val]) end,
     lists:foreach(C, [fun() -> test1() end]).
...