2021年7月

let就跟*.run一样。必须有对象,并且这对象会带进匿名函数里,名字叫it

fun main(args : Array<String>){
    var v1 = "fd"
    var v2:String?
    
    v2 = v1?.let{
        it + " hi"
    }
    
    println(v2)
}

run
可以將 run 想像成一個獨立出來的 Scope , run 會把最後一行的東西回傳或是帶到下一個 chain。
第一個例子像是:
(就是弄一个作用域出来,更SB一点做法就像if(true){})

fun main(args : Array<String>){
    val test = "fd"
    run{
        val test = "fd2"
        println("test2 $test")
    }
    
    println("test1 $test")
}

输出:
test2 fd2
test1 fd

2.*.run 就是省略前某对象名字。直接调用他的属性或方法:

fun main(args : Array<String>){
    var v:V? = V()
    v?.name = "fd"
    v?.run{
        v.t1("hi")
    }
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}

3.run 是支持返回值的

fun main(args : Array<String>){
    val v1 = run{
        "xxx yyy"
    }
    
    println(v1)
}

4.组合作用

fun main(args : Array<String>){
    println("hi run:" + run{
        "hahaha run"
    })
    
    run{
        var v = V()
        v.name = "fd"
        println("test2 ${v.name}")
        v // 这个对象。作为返回对象
    }.t1("vvvv")
}

class V {
    var name = "fd"
    
    fun t1(v:String){
        println("test1 $v $name")
    }
}