關於Ruby一個有這樣的事情:分配變量,如果它是空
@var ||= 'value'
基本上,這意味着'value'
只有@var
尚未分配@var
將被分配(例如,如果@var
是nil
)
我在Kotlin上尋找同樣的東西,但到目前爲止,最接近的將是貓王操作員。有沒有這樣的事情,我錯過了文檔?
關於Ruby一個有這樣的事情:分配變量,如果它是空
@var ||= 'value'
基本上,這意味着'value'
只有@var
尚未分配@var
將被分配(例如,如果@var
是nil
)
我在Kotlin上尋找同樣的東西,但到目前爲止,最接近的將是貓王操作員。有沒有這樣的事情,我錯過了文檔?
我能想到的最簡單的辦法確實使用Elvis操作符:
value = value ?: newValue
如果你這樣做的時候,另一種是使用delegated property,只存儲值,如果其null
:
class Once<T> {
private var value: T? = null
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? {
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
this.value = this.value ?: value
}
}
現在,您可以創建一個使用此像這樣的屬性:
var value by Once<String>()
fun main(args: Array<String>) {
println(value) // 'null'
value = "1"
println(value) // '1'
value = "2"
println(value) // '1'
}
請注意,這不是線程安全的,不允許設置回null
。此外,這確實評估new
表達式,而簡單的elvis操作符版本可能不會。
偉大的見解!非常感謝 –
你可能想要'一旦
@ RuckusT-Boom爲什麼?它現在接受可空類型,但在使用中沒有區別,對吧? – nhaarman
你在找什麼像[懶惰](https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)? – nhaarman
嗯,不是真的......我的意思是,在我的情況下,我想在'prePersist' JPA鉤子上分配一個'uid',我認爲可能Kotlin有一個優雅的方法,而不是檢查'uid'是否爲空並賦值 –
我猜'值=值?:newValue'確實是最短的路。 – nhaarman