美文网首页Kotlin专题kotlin禅与计算机程序设计艺术
更好的理解 Kotlin 标准函数 let、apply、also

更好的理解 Kotlin 标准函数 let、apply、also

作者: RJ_Hwang | 来源:发表于2019-04-27 23:31 被阅读26次

    Kotlin 的 let、apply、also、run、with 这 5 个函数是标准库 kotlin-stdlib-common.jar 包 kotlin.util.Standard.kt 文件内定义的标准函数,通过源代码中函数定义的签名就可以很好的理解透其使用方式。

    Standard.kt 源码中的函数定义:

    public inline fun <T, R> T.let   (block: (T) -> R)               : R
    public inline fun <T>    T.apply (block: T.() -> Unit)           : T
    public inline fun <T>    T.also  (block: (T) -> Unit)            : T
    public inline fun <T, R> T.run   (block: T.() -> R)              : R
    public inline fun <R>      run   (block: () -> R)                : R
    public inline fun <T, R>   with  (receiver: T, block: T.() -> R) : R
    

    函数名为 T.xxx 的为扩展函数,其余则为普通函数。

    总结:

    - T.let T.apply T.also T.run run with
    对象获取 it this it this - this
    返回值 result this this result result result

    代码验证:

    package tech.simter.po
    
    import org.junit.jupiter.api.Assertions.assertEquals
    import org.junit.jupiter.api.Test
    
    // run - 普通函数
    val value = run {
      // here has no this
      "newValue"
    }
    
    class User(var name: String)
    class StandardTest {
      private val clazz = this
    
      @Test
      fun test() {
        assertEquals("newValue", value)
    
        val user = User(name = "oldName")
        var result: Any
    
        // T.let 扩展函数
        result = user.let {
          assertEquals(clazz, this)
          assertEquals(user, it)
          assertEquals("oldName", it.name)
          "newName"
        }
        assertEquals("newName", result)
    
        // T.apply 扩展函数
        result = user.apply {
          assertEquals(user, this)
          assertEquals("oldName", name) // or this.name
        }
        assertEquals(user, result)
    
        // T.also 扩展函数
        result = user.also {
          assertEquals(clazz, this)
          assertEquals(user, it)
          assertEquals("oldName", it.name)
        }
        assertEquals(user, result)
    
        // T.run 扩展函数
        result = user.run {
          assertEquals(user, this)
          assertEquals("oldName", name) // or this.name
          "newName"
        }
        assertEquals("newName", result)
    
        // T.run 扩展函数 - 相当于 this.run {...}
        result = run {
          assertEquals(clazz, this)
          "newName"
        }
        assertEquals("newName", result)
    
        // with - 普通函数
        result = with(user) {
          assertEquals(user, this)
          assertEquals("oldName", name) // or this.name
          "newName"
        }
        assertEquals("newName", result)
      }
    }
    

    相关文章

      网友评论

        本文标题:更好的理解 Kotlin 标准函数 let、apply、also

        本文链接:https://www.haomeiwen.com/subject/vlmlnqtx.html