在我的情况下,我想改变一个原语 - 布尔
我从不喜欢以下类型的代码:
private var firstTime: Boolean = true
...
if (firstTime) {
// do something for the first time here
firstTime = false
}
如果我有一个像:这样的扩展函数,那么会很好
if (firstTime.checkAndUnset()) {
// do something for the first time here
}
这可能吗?
答案 0 :(得分:6)
适用于属性的解决方案是为可变属性编写扩展函数,然后将其与属性引用一起使用。此代码适用于Kotlin 1.1:
fun KMutableProperty0<Boolean>.checkAndUnset(): Boolean {
val result = get()
set(false)
return result
}
用法:
class MyClass {
private var firstTime = true
fun f() {
if (this::firstTime.checkAndUnset()) {
println("First time")
}
}
}
fun main(args: Array<String>) {
val c = MyClass()
c.f() // First time
c.f() //
}
<但是,这对局部变量不起作用(至少在Kotlin 1.1中不行)。 在Kotlin 1.0.x中,bound callable references尚不可用,且上面的解决方案可以重写为这个有点笨拙的代码:
fun <T> KMutableProperty1<T, Boolean>.checkAndUnset(receiver: T): Boolean {
val result = get(receiver)
set(receiver, false)
return result
}
MyClass::firstTime.checkAndUnset(this)
答案 1 :(得分:1)
只需创建以下属性
private var firstTime: Boolean = true
get() {
return if (field) { //Note: field - is keyword in current context
field = false
true
} else false
}
set(v) { field = v }
用法简单
if (firstTime) {
//It's first time
//firstTime is false now
}