2013-07-12 38 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

當前,您將創建一個將字符串映射到方法調用結果的對的列表,例如,假設#isOwner返回boolean,您的列表回調目前是List<Pair<String, Boolean>>

相反,你必須包裝的#isOwner調用一個lambda表達式:

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

現在,回調的類型爲List<Pair<String,()=>boolean>>,或者換句話說:List<Pair<String, Functions.Function0<Boolean>>>

+0

我收到您的實施錯誤。 不兼容的隱式返回類型。預期的java.util.ArrayList > 或java.util.List []但是java.util.ArrayList >> 什麼是|和[]爲? –

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