我對 kotlin 智能轉換感到困惑。在我看來if(condition) / else,相當于when(condition) true -> /false ->,但是智能演員表不適用于我的 when 表達。
我正在使用 kotlin 1.5.30
data class Person(val name: String)
data class Address(val id: String, val person: Person?)
fun getPersonFromAddress(address: Address?): String {
return if (address?.person != null) {
address.person.name
} else {
"Not found"
}
}
fun getPersonFromAddress(address: Address?): String {
return when (address?.person != null) {
true -> address.person.name // <-- Does not compile
false -> "Not found"
}
}
uj5u.com熱心網友回復:
由于它的分析方式,if 運算式轉換為如下所示的 when 運算式:
fun getPersonFromAddress(address: Address?): String {
return when {
address?.person != null -> address.person.name
else -> "Not found"
}
}
這將編譯。
阿when與一種說法是不同于when不帶引數。引數中的運算式首先計算,僅計算一次。然后將該結果(不是運算式)與每種情況進行比較。因此,就它的評估方式而言,它與 if/else 不同。
正如@broot 在評論中提到的,您還可以將空檢查推遲到這樣的 when 情況,并且智能轉換將起作用,因為它正在該分支進行檢查:
fun getPersonFromAddress(address: Address?): String {
return when(address?.person) {
null -> "Not found"
else -> address.person.name
}
}
如果您要將帶有條件的 when 陳述句的嘗試轉換為 if/else 語法,它將如下所示:
fun getPersonFromAddress2(address: Address?): String {
val condition = address?.person != null
return if (condition) {
address.person.name
} else {
"Not found"
}
}
這也不會編譯。
我想這樣做的原因是編譯器在這些條件下必須分析的智能轉換的復雜性可能會通過添加額外的間接檢查而呈指數增長。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312855.html
標籤:科特林
下一篇:帶變數的注釋引數
