1. 程式人生 > 其它 >Android kotlin中let also apply run with的區別

Android kotlin中let also apply run with的區別

使用測試程式碼

class ExtendTest {


    @Test
    fun letDemo() {
        val user = UserInfo()
        val result = user.let {
            it.name = "name1"
            it.age = 20
            it.show()
            80
        }
        println("result=$result")
//        輸出結果
//        name=name1 and age=20
//        result=80
    }


    @Test
    fun applyDemo() {
        val user = UserInfo()
        val result = user.apply {
            name = "name1"
            age = 20
            show()
            80
        }
        println("result=$result")
//        輸出結果
//        name=name1 and age=20
//        result=User物件
    }


    @Test
    fun alsoDemo() {
        val user = UserInfo()
        val result = user.also {
            it.name = "name1"
            it.age = 20
            it.show()
            80
        }
        println("result=$result")

//        輸出結果
//        name=name1 and age=20
//        result=User物件
    }


    @Test
    fun runDemo() {
        val user = UserInfo()
        val result = user.run {
            name = "name1"
            age = 20
            this.show()
            80
        }
        println("result=$result")
//        輸出結果
//        name=name1 and age=20
//        result=80
    }

    @Test
    fun withDemo() {
        val user = UserInfo()
        val result = with(user) {
            name = "name1"
            age = 20
            this.show()
            80
        }
        println("result=$result")
//        輸出結果
//        name=name1 and age=20
//        result=80
    }


    class UserInfo {
        var name = ""
        var age = 30
        fun show() {
            println("name=$name and age=$age")
        }
    }
}

  

let的原始碼

@kotlin.internal.InlineOnly
public inline fun <T, R> T.lets(block: (T) -> R): R {
    contract {//它將表明 block 這個擴充套件方法一定會在這裡被執行一次
        //callsInPlace(lambda: Function<R>, kind: InvocationKind = InvocationKind.UNKNOWN)
        //lambda:執行程式碼塊
        //kind:上面 block 將會被執行的次數,kind 有四種類型
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

public enum class InvocationKind {
    AT_MOST_ONCE,//最多執行一次
    AT_LEAST_ONCE,//至少執行一次
    EXACTLY_ONCE,//有且只有一次
    UNKNOWN//未知  預設值
}

  

  

contract關鍵字

  contract(契約)是一種 Kotlin 面向編譯器約定的一種規則,它幫助編譯器更加智慧地識別某些需要特定的程式碼條件,為程式碼建立更加友好的上下文關聯環境。

  參考地址:https://blog.csdn.net/HJXASLZYY/article/details/122676634  感謝大佬

搜尋

複製