合理的情况下使用Kotlin的'let`

时间:2017-11-06 18:46:21

标签: android kotlin

在Kotlin中,如果对象(let接收者)不是let,则使用null来执行代码是常见的,作为{的替代{1}}检查,如下所示:

if != null

在其他情况下使用val nullable: String? = "anything" nullable?.let { println(it) } 是否有意义?

仅供参考,let是Kotlin的stdlib的一部分,定义如下:

let

4 个答案:

答案 0 :(得分:4)

我看到let用于确定嵌套变量的范围(忽略let返回):

    some.nested.foo.bar.let { bar -> 
        doSomething(bar)
        doMoreStuff(bar)
    }

它可以很好,因为它取代了定义局部变量的需要,但我不确定它实际上有多大用处。

也可以使用apply完成,但可读性稍差,(this而非范围内的bar

答案 1 :(得分:2)

当您使用可以为空的let个变量时,

var也很有用。 例如,我们有这个代码

fun doSomething(value: String) {

}

class A {
    var boo: String? = null
    fun b() {
        if (boo != null) {
            doSomething(boo)
        }
    }
}

if块中我们有编译时错误,因为boo可以在外部更改。要解决这个问题,我们应该创建一个val变量

class A {
    var boo: String? = null
    fun b() {
        val b = boo
        if (b != null) {
            doSomething(b)
        }
    }
}

或使用let

class A {
    var boo: String? = null
    fun b() {
        boo?.let {
            doSomething(it)
        }
    }
} 

答案 2 :(得分:0)

范围界定能力

stdlib函数let使您能够将变量的范围限制在特定的代码块中。如图所示:

compile("a:b:c")
"io.vertx:vertx".let { v->
    compile("$v-lang-kotlin:$vertxVersion")
    compile("$v-lang-kotlin-coroutines:$vertxVersion")
} 
compile("x:y:z")

我们可以选择定义val v: String = "io.vertx:vertx",这可能会使代码更具可读性,因为这是我们在Java中所做的事情。然而,在整个方法中可以访问val。我们只想让compile单位使用 vertx ,因此我们将io.vertx:vertx的变量限制在let块。

有关不同范围函数替代方案的信息可以在this thread中找到。

答案 3 :(得分:0)

您可以通过命名使用let in let

someMethodCall()?.let{ nameOne ->
       // ....
       // some code here
       // ....
       val resultCall = nameOne
       someMethod2Call()?.let { -> nameTwo
          // ...
          val myVariable = nameTwo + resultCall
          // ... 
      }
}