2017-06-01 45 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