2017-06-01 43 views
3

關於Ruby一個有這樣的事情:分配變量,如果它是空

@var ||= 'value' 

基本上,這意味着'value'只有@var尚未分配@var將被分配(例如,如果@varnil

我在Kotlin上尋找同樣的東西,但到目前爲止,最接近的將是貓王操作員。有沒有這樣的事情,我錯過了文檔?

+1

你在找什麼像[懶惰](https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)? – nhaarman

+0

嗯,不是真的......我的意思是,在我的情況下,我想在'prePersist' JPA鉤子上分配一個'uid',我認爲可能Kotlin有一個優雅的方法,而不是檢查'uid'是否爲空並賦值 –

+1

我猜'值=值?:newValue'確實是最短的路。 – nhaarman

回答

7

我能想到的最簡單的辦法確實使用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操作符版本可能不會。

+0

偉大的見解!非常感謝 –

+0

你可能想要'一旦'。否則,你可以使用'var value by Once '這會令人困惑。 –

+0

@ RuckusT-Boom爲什麼?它現在接受可空類型,但在使用中沒有區別,對吧? – nhaarman