Kotlin labmda 调用替代方案

问题描述 投票:0回答:1

假设我们有以下代码:

fun interface A {
    fun a()
}

interface B {
    fun b(a: A)
}

fun x(callback: A.() -> Unit) = object : B {
    override fun b(a: A) {
        a.callback()
        //callback.invoke(a)
    }
}

为什么我们可以使用a.callback()而不是callback.invoke(a) 这样的语法有什么意义呢?在官方文档中找不到它。 是的,这里 a.callback() 也相当于 (a as A).callback()

kotlin lambda callback invoke
1个回答
0
投票

callback
的类型是带有接收器的函数类型。来自文档

函数类型可以选择具有附加的 receiver 类型,该类型在符号中的点之前指定:类型

A.(B) -> C
表示可以在接收者对象
A
上使用参数
B
调用并返回价值
C

callback
A.() -> Unit
类型,因此可以在
A
的实例上调用它(即参数
a
)。

这与您通常调用扩展函数的方式类似。

callback
这里的作用就像
A
上的扩展函数(因为它的类型是
A.() -> Unit
),所以你可以像
x
内部的扩展函数一样调用它。

© www.soinside.com 2019 - 2024. All rights reserved.