2017-04-26 54 views
2

當使用.let { }功能,我注意到這樣做的時候,下面的:科特林。讓{}空安全想必虛假錯誤

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

你必須保證安全水桶在這種情況下,即bucket?.bucket!!而空安全

bucket?.assignedVariantName?.let { <-- added safety check for property 
     bucket.determineVariant() <-- doesn't need to guarantee safety for bucket 
} 

同時使用,讓在桶的財產,而不是直接在鬥我不知道這是否是intenti:已經用?.let保證然後我做了以下的時候發現onitu或Kotlin插件中的錯誤(在這種情況下,我在Android Studio中遇到過這種情況)

其他信息是,存儲桶在這種情況下爲local val,而assignedVariantName是可爲空的var。

val bucket: T? = ... 

回答

14

這是預期的行爲。所述.let { ... } function被定義爲

inline fun <T, R> T.let(block: (T) -> R): R = block(this) 

T可以是空類型,並let可以在空接收機被調用,null.let { }是有效的代碼。

現在就來看看這兩個電話:

  • bucket?.assignedVariantName.let { ... }

    這裏,無論收件人bucket?.assignedVariantName是否爲空,始終調用let

    有可能的情況下bucket?.assignedVariantName爲null,因爲bucket爲空 - 然後null只是傳遞到let,它肯定是不使用安全bucketlet塊內。

    (runnable example of the case)

  • bucket?.assignedVariantName?.let { ... }

    在這種情況下,let被稱爲只有當接收bucket?.assignedVariantName不爲空,要求bucket不是null,且其assignedVariantName不爲空。這個要求使得在let塊內使用bucket是安全的。

+0

非常明確的解釋。謝謝! –