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} 
  • Mapa Mutable no anulable
  • ¿Funciones de extensión Kotlin contra funciones miembro?
  • While loop en el lenguaje de progtwigción Kotlin
  • Miembro de Kotlin y extensión al mismo time
  • acceso al método de extensión kotlin en otro kt
  • Usa la extensión Kotlin en la class java de Android
  • Funciones de extensión para classs genéricas en Kotlin
  • Los generics de Kotlin esperan un tipo inesperado
  • Android Studio y Kotlin: reference no resuelta: también
  • ¿Cómo crear una class estática en Kotlin?
  • Funciones de extensión en types anotados