文章目錄
- 函數中使用,與目前相同類型的 匿名擴充函數
-
- 輸出
- 函數中使用,不同于目前類型的 匿名擴充函數(通常要注意的是這種)
-
- 輸出
- 總結
函數中使用,與目前相同類型的 匿名擴充函數
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()
------
總結
- 匿名擴充函數,可以簡單看作是,把目前擴充類型當作參數的 函數。
<==>block: AnonymousClz.() -> Boolean
block: (AnonymousClz) -> Boolean
- 匿名擴充函數作用域中,對目前擴充類型,擴充了以參數名為函數名的函數
在調用時,可以block: AnonymousClz.() -> Boolean
clz.block()