2015-11-06 101 views
0

我理解執行者的概念,但我在理解kotlin中的執行者時遇到了一些麻煩。也許它的語法沒有幫助。瞭解kotlin執行者

讓我們來看看下面的例子:

 private class AlwaysCallback(private val executor: (() -> Unit) -> Unit, 
            private val cb: Progress.() -> Unit) : Callback { 
     override fun execute(progress: Progress) { 
      executor { 
       progress.cb() 
      } 
     } 
    } 

如果我理解正確,遺囑執行人(() -> Unit) -> Unit是一個封閉的容器。要執行的代碼塊。我不確定這是否屬實,或者它只是一個匿名功能的船隻。

另一件事是,有人可以解釋語法:(() -> Unit) -> Unit

我已閱讀kotlin文檔,閱讀kotlin源代碼並試圖谷歌它,但我真的很難理解這一點。謝謝

+0

對不起,但你試圖實現什麼?你能解釋還是給出一個可用的Java代碼? – voddan

回答

7

() -> Unit是一個函數,它不需要任何參數,並且什麼也不返回。例如,Runnable.run()就是這樣一個功能。你可以看到這樣的功能是一項任務。

所以,(() -> Unit) -> Unit是一個函數,它接受這樣一個函數作爲參數,並且什麼也不返回。例如,Executor.execute(Runnable)就是這樣一個功能。因此,它是一個以任務爲參數的函數(最有可能的是,現在,稍後再執行一次或幾次)。

這裏定義的函數創建我剛纔稱爲任務,而另一個函數返回的執行,即執行任務的函數的例子:

fun createTask():() -> Unit { 
    return { 
     println("Hello world") 
    } 
} 

fun createExecutor() : (() -> Unit) -> Unit { 
    return { task:() -> Unit -> 
     println("I'm going to execute the task...") 
     task() 
     println("I'm going to execute the task a second time...") 
     task() 
    } 
} 

fun main(args: Array<String>) { 
    val task = createTask() 
    val executor = createExecutor() 
    executor(task) 
} 

注意,我還在學習科特林自己,所以我仍然在語法和概念上掙扎。

+0

單位在這裏解釋:https://kotlinlang.org/docs/reference/functions.html#unit-returning-functions。 –

+0

我閱讀了單元關鍵工作的文檔。我現在明白了。你的例子是相當不錯的,但是,當我試圖想象,但有參數和/或返回值時,我仍然有點掙扎。另一件事,'createTask()'返回一個閉包? –

+0

是的。但我認爲恰當的Kotlin術語是「函數文字」,又名lambda表達式。如果它「捕獲」了函數文本之前定義的局部變量,那麼它真的會變成閉包,這在這裏不是這種情況。 –