使用Kotlin的“let”的合理情况

在Kotlin中,如果一个对象( let接收者)不为null ,那么通常使用let来执行代码,以替代if != null检查,如下所示:

 val nullable: String? = "anything" nullable?.let { println(it) } 

在其他情况下,利用let是否有意义?

仅供参考, let Kotlin的stdlib,定义如下:

 @kotlin.internal.InlineOnly public inline fun  T.let(block: (T) -> R): R = block(this) 

我见过let用来限制嵌套variables(忽略let返回):

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

它可以很好,因为它取代了定义一个局部variables的需求,但我不确定它实际上是多么有用。

也可以用apply来完成,尽管可读性稍差,(而不是范围中的bar )。

当您使用可为空的varvariables时, let也很有用。 例如,我们有这个代码

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

在那里, if块内部有编译时错误,因为boo可以在外面改变。 为了解决这个问题,我们应该创建一个valvariables

 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) } } } 

范围界定能力

stdlib函数let你可以将variables的作用域限制在一个特定的代码块中。 如下所示:

 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 。 我们只是想把它用于包含vertxcompile单元,因此我们将variablesio.vertx:vertx限制在let块中。

在这个线程中可以find关于不同范围函数替代的信息。