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

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

我从来不喜欢以下types的代码:

private var firstTime: Boolean = true ... if (firstTime) { // do something for the first time here firstTime = false } 

会很好,如果我可以有一个扩展function,如:

 if (firstTime.checkAndUnset()) { // do something for the first time here } 

这可能吗?

可以为属性工作的解决方案是编写可变属性的扩展函数,然后将其与属性引用一起使用。 此代码与Kotlin 1.1一起工作:

 fun KMutableProperty0.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) { val c = MyClass() cf() // First time cf() // } 

(检查可运行的演示)

但是,这不适用于局部variables(至少在Kotlin 1.1中不适用)。


在Kotlin 1.0.x中, 绑定可调用的引用还没有可用,上面的解决方案可以被重写为这个有些笨拙的代码:

 fun  KMutableProperty1.checkAndUnset(receiver: T): Boolean { val result = get(receiver) set(receiver, false) return result } 

 MyClass::firstTime.checkAndUnset(this) 

只需创建以下属性

 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 }