Kotlin内联函数在参数固定时是否会内联分支代码?
Kotlin内联函数编译后的代码展开结果
我定义了如下Kotlin内联函数:
inline fun run(type: Int, block: (String) -> Unit) { when(type) { Scenario.A -> { block("A") } Scenario.B -> { block("B") } } }
之后进行了两次调用:
run(Scenario.A) { println(it) } run(Scenario.B) { println(it) }
请问编译后的代码会转换为下面哪一种?
第一种:
println("A") println("B")
第二种:
when(Scenario.A) { Scenario.A -> { println("A") } Scenario.B -> { println("B") } } when(Scenario.B) { Scenario.A -> { println("A") } Scenario.B -> { println("B") } }
答案是第二种形式。
Kotlin的内联函数会把整个函数体直接替换到调用位置,同时将传入的Lambda表达式内容内联到对应的调用点。原run函数里的when分支逻辑是函数体的核心部分,会被完整复制到每一处调用run的地方,再把Lambda中的println(it)替换掉block的调用,同时将it替换为对应分支的字符串参数("A"或"B")。
内容的提问来源于stack exchange,提问作者Lionel Briand
相关产品推荐
相关产品推荐

