天天看點

Kotlin 匿名擴充函數作為參數時的語義函數中使用,與目前相同類型的 匿名擴充函數函數中使用,不同于目前類型的 匿名擴充函數(通常要注意的是這種)總結

文章目錄

  • 函數中使用,與目前相同類型的 匿名擴充函數
    • 輸出
  • 函數中使用,不同于目前類型的 匿名擴充函數(通常要注意的是這種)
    • 輸出
  • 總結

函數中使用,與目前相同類型的 匿名擴充函數

class AnonymousExtendFun1 {

    fun test1(block: AnonymousExtendFun1.() -> Unit) {
        block()
        block(this) // block() 傳不傳參都可以
        block.invoke(this) // invoke() 必須傳參
        println("AnonymousExtendFun1.test1()")
        println("------")
    }

    fun test2(block: AnonymousExtendFun1.() -> Boolean) {
        // 在目前 test2 函數作用域内,可以看作,對 AnonymousExtendFun 擴充了一個 名為 block 的函數
        this.block()
//        this.block(this) // error. 不能傳參
//        this.block.invoke() // error. 沒有 .invoke() 調用
        println("AnonymousExtendFun1.test2()")
        println("------")
    }

    fun test3(block: (AnonymousExtendFun1) -> Boolean) {
        block(this) // 必須傳參
        println("AnonymousExtendFun1.test3()")
        println("------")
    }
}

fun main(args: Array<String>) {
    val obj1 = AnonymousExtendFun1()
    obj1.test1 {
        println("call AnonymousExtendFun1.test1()")
    }

    obj1.test2 {
        println("call AnonymousExtendFun1.test2()")
        true
    }

    obj1.test3 {
        println("call AnonymousExtendFun1.test3()")
        true
    }
}
           

輸出

call AnonymousExtendFun1.test1()
call AnonymousExtendFun1.test1()
call AnonymousExtendFun1.test1()
AnonymousExtendFun1.test1()
------
call AnonymousExtendFun1.test2()
AnonymousExtendFun1.test2()
------
call AnonymousExtendFun1.test3()
AnonymousExtendFun1.test3()
------
           

函數中使用,不同于目前類型的 匿名擴充函數(通常要注意的是這種)

class AnonymousClz
class AnonymousExtendFun2 {

    fun test1(clz: AnonymousClz, block: AnonymousClz.() -> Unit) {
        block(clz) // 必須傳參
        block.invoke(clz) // invoke() 必須傳參
        println("AnonymousExtendFun2.test1()")
        println("------")
    }

    fun test2(clz: AnonymousClz, block: AnonymousClz.() -> Boolean) {
        // 在目前 test2 函數作用域内,可以看作,對 AnonymousClz 擴充了一個 名為 block 的函數
        clz.block()
//        clz.block.invoke() // error.
        println("AnonymousExtendFun2.test2()")
        println("------")
    }

    // 基于 test1(),匿名擴充函數的實作,可以等價轉成 test3()
    fun test3(clz: AnonymousClz, block: (AnonymousClz) -> Boolean) {
        block(clz)
        block.invoke(clz)
        println("AnonymousExtendFun2.test3()")
        println("------")
    }
}
fun main(args: Array<String>) {
	val obj2 = AnonymousExtendFun2()
    val clz = AnonymousClz()
    obj2.test1(clz) {
        println("call AnonymousExtendFun2.test1()")
    }

    obj2.test2(clz) {
        println("call AnonymousExtendFun2.test2()")
        true
    }

    obj2.test3(clz) {
        println("call AnonymousExtendFun2.test3()")
        true
    }
}
           

輸出

call AnonymousExtendFun2.test1()
call AnonymousExtendFun2.test1()
AnonymousExtendFun2.test1()
------
call AnonymousExtendFun2.test2()
AnonymousExtendFun2.test2()
------
call AnonymousExtendFun2.test3()
call AnonymousExtendFun2.test3()
AnonymousExtendFun2.test3()
------
           

總結

  1. 匿名擴充函數,可以簡單看作是,把目前擴充類型當作參數的 函數。

    block: AnonymousClz.() -> Boolean

    <==>

    block: (AnonymousClz) -> Boolean

  2. 匿名擴充函數作用域中,對目前擴充類型,擴充了以參數名為函數名的函數

    block: AnonymousClz.() -> Boolean

    在調用時,可以

    clz.block()