在扩展功能中修改“this”

我想编写修改“this”的扩展函数,例如:

var a = false a.toggle() // now a contains false 

要么

 var a = 1 a.increment() // now a contains 2 

Kotlin有可能吗?

我可以创建返回修改值的扩展函数,但留下“这个”未经修改,但我想要更多的方便! 它看起来像Swift可以做到这一点。

现在还不支持对变量的引用,但可以创建与属性引用一起使用的扩展函数:

 fun KMutableProperty0<Boolean>.not() = set(get().not()) fun KMutableProperty0<Int>.inc() = set(get().inc()) var a = false var b = 1 fun main(vararg args: String) { ::a.not() // now `a` contains `true` ::b.inc() // now `b` contains `2` } 

或者,如果您希望扩展函数返回新的值并进行设置:

 fun KMutableProperty0<Boolean>.not(): Boolean = get().not().apply(setter) fun KMutableProperty0<Int>.inc(): Int = get().inc().apply(setter) 

你不能这样做,因为它会要求你通过引用传递给函数。 这在Kotlin中是不可能的。 Kotlin中的所有函数参数都是按值传递的。

但是,您可以使用以下构造来模拟行为。 这不是很方便。

 fun Boolean.toggle(getter: () -> Boolean, setter: (Boolean) -> Unit) { setter(!getter()) } var a = false println(a) // prints false a.toggle({a}, {a = it}) // Or a.toggle(a::get, a::set), but that isn't supported (yet?) println(a) // prints true 

与函数的其他参数一样, this是对对象的引用。 另一方面, var a也是对同一个对象的引用。 所以基本上你有两个指向同一个实例的引用:

 var a = false val this = a // a.toggle() 

你可以对其中一个引用进行任何操作,并改变另一个引用。 它们是具有相同价值的无关变量,仅此而已。

你可以做的(理论上)是使对象本身可以改变:

 class MutableBoolean(val value: Boolean) val a = MutableBoolean(false) a.toggle() fun MutableBoolean.toggle() {value = !value}