关于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