Schreiben einer Kotlin-Util-Funktion, die Selbstreferenz im Initialisierer liefert

Ich versuche, meinen Hack von einer Antwort auf eine andere zu verallgemeinernFrag.

Es sollte eine Möglichkeit bieten, auf einen Wert zu verweisen, der noch nicht in seinem Initialisierer erstellt wurde (natürlich nicht direkt, aber in Lambdas und Objektausdrücken).

Was ich im Moment habe:

class SelfReference<T>(val initializer: SelfReference<T>.() -> T) {
    val self: T by lazy {
        inner ?: throw IllegalStateException("Do not use `self` until initialized.")
    }

    private val inner = initializer()
}

fun <T> selfReference(initializer: SelfReference<T>.() -> T): T {
    return SelfReference(initializer).self
}

Es funktioniert, siehe dieses Beispiel:

class Holder(var x: Int = 0,
             val action: () -> Unit)

val h: Holder = selfReference { Holder(0) { self.x++ } }
h.action()
h.action()
println(h.x) //2

Aber an dieser Stelle die Art und Weise, in derinitializer referenziert der konstruierte Wert istself Eigentum

Und meine Frage ist: gibt es eine Möglichkeit, @ neu zu schreibSelfReference damitinitializer wird ein Argument (oder ein Empfänger) übergeben, anstatt @ zu verwendself Eigentum? Diese Frage kann wie folgt umformuliert werden: Gibt es eine Möglichkeit, einen trägen Empfänger / ein Argument an eine Funktion zu übergeben oder diese Semantik auf irgendeine Weise zu erreichen?

Was sind die anderen Möglichkeiten, um den Code zu verbessern?

UPD: Eine Möglichkeit besteht darin, eine Funktion zu übergeben, die @ zurückgibself, also würde es als @ verwendet werdit() innerhalb desinitializer. Ich suche noch andere.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage