在Kotlin中,如果对象(let
接收者)不是let
,则使用null
来执行代码是常见的,作为{的替代{1}}检查,如下所示:
if != null
在其他情况下使用val nullable: String? = "anything"
nullable?.let {
println(it)
}
是否有意义?
仅供参考,let
是Kotlin的stdlib的一部分,定义如下:
let
答案 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
// ...
}
}