scala: Kreisreferenz beim Erstellen eines Objekts?

8

Ich bin zufällig in eine Situation wie diese geraten (das Beispiel wurde vereinfacht, um das Problem zu isolieren):

%Vor%

Wer möchte die Ausgabe erraten? : -)

%Vor%

Die Ausgabe macht Sinn. Anscheinend zum Zeitpunkt, zu dem das zweite Objekt erstellt wird, ist das erste Objekt noch nicht vorhanden, daher wird null zugewiesen. Das Problem ist ... Es ist so falsch! Ich habe ein paar Stunden gebraucht, um das hier zu verfolgen. Sollte der Compiler nicht etwas dazu sagen? Interessanterweise habe ich, als ich versucht habe, das Ding als Scala-Skript auszuführen (den gleichen Code, minus object Main und def main -Zeilen und% code% s schließen), eine unendliche Sequenz (nicht wirklich unendlich - irgendwann Liste stoppt, ich denke, aufgrund einer gewissen Einschränkung der Tiefe von Exception-Traces oder etwas) von Ausnahmen wie dieser:

%Vor%

Ich würde gerne etwas zur Laufzeit mindestens so informativ bekommen ...

Ok. Ich beendete meine Tirade. Jetzt denke ich, ich sollte etwas fragen. :) Könnten Sie also ein schönes Design für Fallobjekte empfehlen, die zueinander zeigen? Übrigens gibt es in meiner realen Situation mehrere Objekte, die kreisförmig auf die nächste und vorherige Instanz zeigen (die letzte zeigt auf die erste und umgekehrt).

Mit Scala 2.8.1-final

BEARBEITEN: Ich habe eine Lösung für mein Hauptproblem gefunden:

%Vor%

Dies scheint in kompilierter Version zu funktionieren (aber nicht als Scala-Skript!). Könnte jemand etwas Licht auf das werfen, was hier vor sich geht?

EDIT2: Dies funktioniert wie ein Skript (das gleiche, nur } s verwenden):

%Vor%     
Vilius Normantas 12.02.2011, 13:24
quelle

1 Antwort

9

Der übliche Weg ist wie folgt (geänderte Verschachtelung, damit Sie ihn in die REPL einfügen können):

%Vor%

Das heißt, nehmen Sie einen Namen-Parameter und stecken Sie ihn in ein lazy val für zukünftige Referenz.

Bearbeiten: Die gefundene Korrektur funktioniert, weil Objekte selbst faul sind, weil Sie darauf verweisen können, aber sie werden erst erstellt, wenn Sie sie verwenden. Somit kann sich ein Objekt frei auf den anderen richten, ohne dass es erforderlich ist, dass das andere bereits initialisiert wurde.

    
Rex Kerr 12.02.2011, 13:35
quelle

Tags und Links