2010-07-16 2 views
1

내가 test()를 호출하면 작동하지 않습니다. 누군가 이것을 설명 할 수 있습니까?얼랭 - Anonymouos 함수

-module(anony). 

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

test1() -> "hello". 

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

합니다. "안녕하세요"를 인쇄하고 싶습니다. 맞습니까? – gleber

답변

2

첫째, C 변수는 전혀 사용되지 않았으며, 두 번째 당신은 test1fun/end A를 포장한다 : 자체

-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]). 
+1

'fun() -> test1 end'는'test1'을 전혀 호출하지 않고'test1' 원자만을 반환합니다. – cthulahoops

+0

@cthulahoops 감사합니다. 맞습니다 (+1) –

7

test1는 단순히 원자 아닌 참조로를 지역 함수. 함수에 대한 참조를 만들려면 다음과 같이 fun/Function을 사용하십시오.

-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

다른 두 개의 대답이 실제로 질문에 대답합니다. 나는 그것들에 더하고 싶다.

원자를 전달하고 해당 이름의 함수를 호출 할 수 있기를 기대합니다. 로컬 기능에는 사용할 수 없습니다. 그러나 수출 된 기능을 위해 아주 가능하다.

그래서 당신은 (: 및 "디버그"을 "C"변경 "? MODULE을"내 유일한 변화는 추가하는 것입니다) : 같은 것을 할 수있는 당신은 결과를 의도을 지정해야

-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]). 
+0

흥미로운 대안입니다. 성능 측면에서 다른 대답 (fun1/0을 사용하여 명시 적 함수 참조 만들기)과 비교하는 방법에 대해 궁금합니다. –

+0

"외부"함수 호출로 인해 솔루션이 약간 느려집니다. 반면에 그들은 두 가지 다른 문제를 해결합니다. –