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.