1.引言
最近接手了一个kotlin项目,遇到apply内联函数,于是花点时间瞅了瞅。发现还有点意思。于是花点时间整理整理。
2.正题
2.1 run 函数
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
传入的是一个T的拓展对象。返回一个泛型R。R类型可以是一个函数,一个变量,一个类的实例
例如:
val resultRun = test.run {
name = "xys"
age = 3
println("Run内部 $this")
age
}
2.2 let函数
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
传入一个方法,参数为T,返回一个泛型R。let函数 和run的函数 都会返回一个泛型R。主要的区别在于参数。一个参数是T.() 一个参数是(T) 。根据面向对象思维。当方法体是对那个对象进行拓展,我们采用run函数;当方法体是业务逻辑,对象仅仅只是一个参数作用的时候,我们就选用let
2.3 apply函数
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
传入一个拓展函数,返回值为对象本身this。
例子:
var s2=s.apply {
s.address = "深圳"
s.age = 100
}
2.4 also函数
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}
also 函数 和apply函数的区别,在于 also函数的参数是(T)。apply参数是T.()。。例如类B的一个方法 要使用类A对象。我们此刻只能是B.aslo(A)。可以看出also 更加适用于对对象的操作。apply适用于单对象的操作。
2.5 with 函数
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
with函数 前面没有T. 意味着 不能被对象直接调用。需要将调用的对象T,作为receiver参数。外加一个T的拓展函数。最后返回一个泛型R。这个泛型可以是函数,可以是基本变量