2013-07-12 2 views
1

xtend에서 콜백 함수를 호출하려면 어떻게해야합니까?xtend의 ​​콜백 함수

내가 C. 예에서와 비슷한 뭔가를 찾고 있어요 :

struct callbacks 
    { 
     char name[10]; 
     boolean (*pfState)(); 
    }; 

    static const struct callbacks call[] = { 
     {"YOURS", &isOwner}, 
     {"OURS", &our_owner} 
    }; 

그래서, 난 그냥 같이 호출합니다 : call[0].pfState().

나는 xtend에서 비슷한 ArrayList를 만들었습니다.

val you = new youModule() 
    val our = new ourModule() 
    val callbacks = newArrayList('YOURS' -> you.isOwner, 'OURS' -> our.isOwnder); 

제대로하고 있습니까? 쌍에서 함수 호출을 실행하려면 어떻게해야합니까?

답변

0

현재 메소드 호출의 결과에 문자열을 매핑하는 쌍 목록을 만듭니다. #isOwnerboolean이라고 가정하면 목록 콜백은 현재 List<Pair<String, Boolean>>입니다.

대신, 당신은 람다 식에 #isOwner의 호출을 래핑 있습니다 List<Pair<String, Functions.Function0<Boolean>>> :

val callbacks = newArrayList(
    'YOURS' -> [| you.isOwner ], 
    'OURS' -> [| our.isOwnder ] 
); 

지금, 콜백 유형 List<Pair<String,()=>boolean>>, 또는 다른 말로있다.

+0

구현에 오류가 발생했습니다. 암시 적 반환 형식이 호환되지 않습니다. 예상되는 java.util.ArrayList > 또는 java.util.List [] 였지만 java.util.ArrayList >> What 's of | 그리고? –

0

변수에 "콜백"이 저장되어있는 경우 apply을 호출하여 함수를 호출해야합니다.

다음은 'YOURS'및 'OURS'키 아래에 저장된 두 개의 콜백을 포함하는 해시 맵을 보여주는 간단한 예입니다. 호출 될 때 각 콜백 함수는 다른 메시지를 인쇄하고 부울 값을 반환합니다.

val callbacks = newHashMap(
     'YOURS' -> [| println("calling the first callback"); true ], 
     'OURS' -> [| println("calling the second callback"); false ] 
    ) 

    val result = callbacks.get("YOURS").apply 

// result is: true 
// console output is: calling the first callback