Modificar "esto" en la function de extensión

Quiero escribir la function de extensión que modifica "esto", por ejemplo:

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

o

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

¿Es posible en Kotlin?

Puedo crear una function de extensión que devuelva un valor modificado, pero deja "esto" sin modificar, ¡pero quiero aún más conveniencia! Parece que Swift puede hacer eso.

Las references a variables aún no son compatibles, pero puede crear funciones de extensión para usar con references de properties :

 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` } 

O si prefiere que las funciones de extensión devuelvan el nuevo valor junto con su configuration:

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

No puede hacer esto porque requeriría pasar a function a la reference. Esto no es posible en Kotlin. Todos los arguments de funciones en Kotlin se pasan por valor.

Sin embargo, puedes simular el comportamiento usando la siguiente construcción. Aunque no es muy conveniente.

 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 

Como cualquier otro parámetro de una function, this es una reference a un object. Por otro lado, var a es una reference al mismo object también. Entonces, básicamente, tienes dos references que apuntan a la misma instancia:

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

No se puede manipular una de esas references y cambiar la otra. Son variables no relacionadas con el mismo valor, nada más.

Lo que puedes hacer (en teoría) es hacer que el object en sí mismo sea modificable:

 class MutableBoolean(val value: Boolean) val a = MutableBoolean(false) a.toggle() fun MutableBoolean.toggle() {value = !value} 
  • Función genérica de extensión de Kotlin con types básicos sin API de reflexión
  • Miembro de Kotlin y extensión al mismo time
  • Funciones de extensión en types anotados
  • Problema con el método de extensión en el script de Kotlin
  • Kotlin: ¿Cómo ejecutar methods de service en el context de una class de transacción?
  • ¿Cómo creo una function de extensión en Kotlin, que opera en una class?
  • Kotlin class NoClassDefFoundError crash
  • En kotlin, cómo devolver una instancia definida por un parámetro de class genérico
  • ¿Hay alguna diferencia entre "object receptor" y "receptor de extensión"
  • Método de extensión de Kotlin como alias para el nombre de método largo?
  • ¿Convertir mi proyecto de estudio andorid existente a kotlin?