有没有办法编写一个扩展函数来改变对象的值?
在我的情况下,我想改变一个原始的布尔
我从来不喜欢以下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 }