Schreiben einer Kotlin-Util-Funktion, die im Initialisierer eine Selbstreferenz bereitstellt

8

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, die self zurückgibt und somit als it() in initializer verwendet wird. Suche immer noch nach anderen.     
hotkey 30.01.2016, 10:04
quelle

1 Antwort

0
  

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.

    
Aro 26.06.2017 18:00
quelle