有没有办法编写一个更改对象值的扩展函数?

时间:2017-02-12 07:26:22

标签: kotlin

在我的情况下,我想改变一个原语 - 布尔

我从不喜欢以下类型的代码:

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
}

这可能吗?

2 个答案:

答案 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() //
}

(check the runnable demo)

<但是,这对局部变量不起作用(至少在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
}