inline noinline crossinline

2023-05-28  本文已影响0人  长点点

除了crossinline和noinline,Kotlin中还有一个和inline相关的关键字,就是reified。这些关键字的作用区别,应用场景如下:

下面是一些使用这些关键字的代码示例:

// 定义一个接收两个Int参数和一个(Int, Int) -> Int类型的lambda参数的内联函数
inline fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    // 调用lambda参数并返回结果
    return operation(a, b)
}

// 调用内联函数,并传入两个Int值和一个lambda表达式
val result = calculate(10, 20) { x, y -> x + y }

// 编译后相当于
val result = 10 + 20
// 定义一个接收一个() -> Unit类型的lambda参数的内联函数
inline fun runOnThread(crossinline action: () -> Unit) {
    // 将lambda参数传递给一个线程对象
    val thread = Thread {
        // 在线程中调用lambda参数
        action()
    }
    // 启动线程
    thread.start()
}

// 调用内联函数,并传入一个lambda表达式
runOnThread {
    // 在线程中打印一条信息
    println("Hello from thread")
}

// 如果不使用crossinline,就不能在lambda表达式中使用return直接返回外层函数
runOnThread {
    // 尝试在线程中返回外层函数
    return // 编译错误:return is not allowed here
}
// 定义一个接收两个() -> Unit类型的lambda参数的内联函数
inline fun runBoth(noinline action1: () -> Unit, action2: () -> Unit) {
    // 调用第一个lambda参数
    action1()
    // 调用第二个lambda参数
    action2()
}

// 调用内联函数,并传入两个lambda表达式
runBoth({
    // 打印一条信息
    println("Hello")
}, {
    // 返回外层函数
    return // 正常返回
})

// 如果不使用noinline,就不能将lambda参数作为另一个非内联函数的参数
fun runLater(action: () -> Unit) {
    // 延迟一秒后调用action
    Handler().postDelayed(action, 1000)
}

runBoth({
    // 将第一个lambda参数作为另一个非内联函数的参数
    runLater(it) // 编译错误:non-local return not allowed
}, {
    // 打印一条信息
    println("World")
})
// 定义一个接收一个Any类型的参数和一个泛型类型T的内联函数
inline fun <reified T> isA(value: Any) = value is T

// 调用内联函数,并传入一个Any类型的值和一个泛型类型String
val result = isA<String>("Hello")

// 编译后相当于
val result = "Hello" is String

// 如果不使用reified,就不能根据泛型类型做类型判断
fun <T> isA(value: Any) = value is T // 编译错误:Cannot check for instance of erased type: T

上一篇 下一篇

猜你喜欢

热点阅读