Kotlin-标准库函数run
特点
- 持有
this
。- 返回值为
lambda表达式
的值。- 作用与
with
相同。
定义
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
定义代码解释
-
fun <T, R> T.run(block: T.() -> R): R
是一个扩展函数,它扩展了任何类型T
。可以在任何T
类型的对象上调用这个函数,而不需要在T
类中显式定义它。这个函数的接收者(即被扩展的对象)在函数体内通过this
关键字访问。 -
合约(contract):是Kotlin 1.3及以后版本中引入的合约系统的一部分。合约允许开发者指定函数与其参数之间的行为约定,这有助于编译器进行更精确的优化和错误检查。
-
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
表示block
这个lambda表达式将在run
函数体内恰好被调用一次。这有助于编译器理解block
的执行上下文,从而可能优化代码或提供更准确的错误检查。 -
block: T.() -> R
是一个函数类型(也称为lambda表达式或匿名函数)的声明,它具有特定的接收者类型和返回类型。这个特定的声明方式表示这是一个扩展函数类型的lambda表达式,它扩展了T
类型的对象。T
:这是lambda表达式的接收者类型。在这个上下文中,T
是run
扩展函数所应用的对象的类型。当run
函数被调用时,它会将自身(即调用它的对象)作为隐式的this
传递给block
lambda表达式。() -> R
:这部分指定了lambda表达式的参数列表和返回类型。这里的空括号()
表示lambda表达式不接受任何参数(除了隐式的this
接收者之外)。R
是lambda表达式的返回类型。T.()
:将这两部分组合起来,T.()
表示这是一个扩展函数类型的lambda表达式,它作用于T
类型的对象上。在lambda表达式内部,你可以直接访问和操作这个T
类型的对象,就像它是一个扩展函数或成员函数一样,尽管实际上它只是一个lambda表达式。
使用方法
传入lambda表达式作为参数
fun main() {
val result = "hello world".run {
"hello run"
}
println(result)
}
输出结果:
hello run
传入函数引用(function reference)作为参数
fun main() {
"hello world".run(::println)
}
输出结果:
hello world
链式调用
import java.util.*
fun main() {
"hello world".run {
this.uppercase(Locale.getDefault())
}.run {
this.substring(0, 5)
}.run(::println)
}
输出结果:
HELLO