Android kotlin中let also apply run with的區別
阿新 • • 發佈:2022-05-13
使用測試程式碼
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 感謝大佬
搜尋
複製