Ich versuche, meinen Hack von einer Antwort auf eine andere Frage zu verallgemeinern.
Es sollte eine Möglichkeit bieten, auf einen Wert zu verweisen, der noch nicht in seinem Initialisierer konstruiert wurde (natürlich nicht direkt, aber in Lambdas und Objektausdrücken).
Was ich gerade habe:
%Vor%Es funktioniert, siehe folgendes Beispiel:
%Vor% Aber an diesem Punkt ist die Art, wie initializer
auf den konstruierten Wert verweist, self
property.
Und meine Frage ist: Gibt es eine Möglichkeit, SelfReference
neu zu schreiben, so dass initializer
ein Argument (oder ein Empfänger) übergeben wird, anstatt self
property? Diese Frage kann neu formuliert werden: Gibt es eine Möglichkeit, einen träge bewerteten Empfänger / Argument einer Funktion zu übergeben oder diese Semantik irgendwie zu erreichen?
Was sind die anderen Möglichkeiten, den Code zu verbessern?
UPD: Eine Möglichkeit besteht darin, eine Funktion zu übergeben, dieself
zurückgibt und somit als it()
in initializer
verwendet wird. Suche immer noch nach anderen.
Gibt es eine Möglichkeit, SelfReference neu zu schreiben, so dass initializer ein Argument (oder ein Empfänger) übergeben wird, anstatt Eigeneigenschaft zu verwenden? Diese Frage kann neu formuliert werden: Gibt es eine Möglichkeit, einen träge bewerteten Empfänger / Argument einer Funktion zu übergeben oder diese Semantik irgendwie zu erreichen?
Ich bin mir nicht sicher, ob ich Ihren Anwendungsfall vollständig verstanden habe, aber das mag das sein, wonach Sie suchen:
%Vor% Das funktioniert, weil holderAction
ein Lambda mit einem Empfänger ist ( Holder.() -> Unit
), der den Lambda-Zugriff auf die Mitglieder des Empfängers gibt.
Dies ist eine allgemeine Lösung, da Sie möglicherweise die Signatur des jeweiligen Holder
-Konstruktors nicht ändern können. Es mag erwähnen, dass diese Lösung nicht erfordert, dass die Klasse offen ist, andernfalls könnte ein ähnlicher Ansatz mit einer Unterklasse unter Verwendung eines sekundären Konstruktors durchgeführt werden.
Ich bevorzuge diese Lösung zum Erstellen einer SelfReference
-Klasse, wenn nur wenige Klassen die Änderung benötigen.
Vielleicht möchten Sie nach null
suchen, anstatt !!
, um einen hilfreichen Fehler zu erzeugen. Wenn Holder im Konstruktor oder im init-Block action
aufruft, erhalten Sie eine Nullzeiger-Ausnahme.
Tags und Links initialization kotlin lazy-evaluation this