kotlin

Kotlin 内联函数:run,let,apply,also,w

2020-06-07  本文已影响0人  过期的薯条

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。这个泛型可以是函数,可以是基本变量

上一篇下一篇

猜你喜欢

热点阅读