2017-02-12 3 views
6

In meinem Fall möchte ich eine primitive ändern - BooleanGibt es eine Möglichkeit, eine Erweiterungsfunktion zu schreiben, die den Wert des Objekts ändert?

ich nie die folgende Art von Code gefallen:

private var firstTime: Boolean = true 
... 

    if (firstTime) { 
     // do something for the first time here 
     firstTime = false 
    } 

schön wäre, wenn ich eine Erweiterungsfunktion wie haben könnte:

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

Ist das möglich?

+2

Ist dies eine Verwendung Fall, in dem ein [faul Delegierten] (https://kotlinlang.org/docs/reference/delegated-properties.html#lazy) helfen würde? –

Antwort

6

Eine Lösung, die für Eigenschaften funktionieren würde, besteht darin, eine Erweiterungsfunktion für änderbare Eigenschaften zu schreiben und sie dann mit der Eigenschaftsreferenz zu verwenden. Dieser Code Arbeit mit Kotlin 1.1:

fun KMutableProperty0<Boolean>.checkAndUnset(): Boolean { 
    val result = get() 
    set(false) 
    return result 
} 

Verbrauch:

class MyClass { 
    private var firstTime = true 

    fun f() { 
     if (this::firstTime.checkAndUnset()) { 
      println("First time") 
     } 
    } 
} 

fun main(args: Array<String>) { 
    val c = MyClass() 
    c.f() // First time 
    c.f() // 
} 

(check the runnable demo)

Dies ist jedoch nicht für lokale Variablen arbeiten (zumindest nicht in Kotlin 1.1).


In Kotlin 1.0.x sind bound callable references noch nicht verfügbar, und die Lösung oben kann diesen etwas schwerfälligen Code neu geschrieben werden:

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

MyClass::firstTime.checkAndUnset(this) 
1

einfach erstellen folgende Eigenschaft

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 } 

Und Nutzung so einfach wie

if (firstTime) { 
    //It's first time 
    //firstTime is false now 
} 
Verwandte Themen