在使用.let {}函数时,我注意到在执行以下操作时:
bucket?.assignedVariantName.let {
bucket?.determineVariant() <-- guarantee safety for bucket
}
在这种情况下,您必须保证铲斗的安全性,即铲斗?。或桶!而空安全性
答案 0 :(得分:3)
由于bucket
可为空,因此您无需在let
上调用assignedVariantName
,就可以这样做
bucket?.let {
it.determineVariant()
}
答案 1 :(得分:2)
科特林.let{}
方法提供了空安全性
bucket?.assignedVariantName?.let {
// use `it` as non-null variable
it.determineVariant()
}
您需要在let块内使用it
才能使用它。
答案 2 :(得分:2)
标准功能 let() 提供 block 作为lambda方法表达式,以供调用时回调使用。因此,在 block 的参数中传递要调用它的变量。
因此,如果您在安全呼叫接线员上使用它,它将在回调中为您提供非空变量作为 it
。您还可以根据需要将其重命名,如下所示:
bucket?.assignedVariantName?.let {
it.determineVariant() //<-- You can directly use it here
}
或重命名它:
bucket?.assignedVariantName?.let { name ->
name.determineVariant() //<-- Renaming `it` to `name`
}
答案 3 :(得分:0)
由于'bucket'是可以为空的变量,因此在Kotlin中有多种方法可以进行null安全调用,其中一种标准方法是将'let'函数与安全调用运算符-'?'
因此,如果您想在这种情况下保证铲斗的安全性,那么应该
bucket?.let { nullSafeBucket ->
nullSafeBucket.assignedVariantName?.let { nullSafeAssignedVariantName ->
nullSafeBucket.determineVariant() -- > bucket is null safe
//assignedVariantName is as well null safe
}
}
}
重要说明-桶!!如果该值为null,将抛出NPE,这将导致崩溃;因此,除非100%确保该值不为null,否则不建议这样做。