问题描述
如果执行以下代码:
inline fun function2( action: () -> Unit) {
action()
}
fun function1() {
function2{ printCurrentStack() }
}
fun printCurrentStack() {
RuntimeException().printstacktrace()
}
fun main() {
function1()
}
您将获得以下输出:
at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:17)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$1.invoke(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$1.invoke(PrimeNumbers.kt)
at com.kotlin.playground.functional.PrimeNumbersKt.function2(PrimeNumbers.kt:8)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)
因此,在这种情况下,堆栈有 7 个元素。
现在,如果我将 function2
标记为内联并执行代码,我会得到以下输出:
at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:17)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:13)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)
这看起来效果很好,调用堆栈的大小减少了 3。
但是,如果我更新 function1
以在将 lambda 发送到 function2
之前将其存储在变量中:
fun function1() {
val lambda = { printCurrentStack() }
function2(lambda)
}
输出更改为:
at com.kotlin.playground.functional.PrimeNumbersKt.printCurrentStack(PrimeNumbers.kt:15)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$lambda$1.invoke(PrimeNumbers.kt:10)
at com.kotlin.playground.functional.PrimeNumbersKt$function1$lambda$1.invoke(PrimeNumbers.kt)
at com.kotlin.playground.functional.PrimeNumbersKt.function1(PrimeNumbers.kt:21)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt:19)
at com.kotlin.playground.functional.PrimeNumbersKt.main(PrimeNumbers.kt)
尽管 function2
仍被标记为 inline
函数,但调用堆栈的大小从 4 变为 6。
如果将 lambda 存储在变量中,则似乎无法内联 lambda 调用。
为什么会发生这种情况?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)