Kotlin .let {}无效安全性

时间:2019-07-10 08:02:41

标签: android kotlin

在使用.let {}函数时,我注意到在执行以下操作时:

bucket?.assignedVariantName.let { 
    bucket?.determineVariant() <-- guarantee safety for bucket 
}

在这种情况下,您必须保证铲斗的安全性,即铲斗?。或桶!而空安全性

4 个答案:

答案 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,否则不建议这样做。