Entwerfen einer praktischen Standardwertkarte in Scala

8

Ich benutze viele verschachtelte Maps, zB Map [Int, Map [String, Set [String]]], und ich möchte gerne neue Maps, Sets usw. automatisch erstellen, wenn ich auf a zugreife neuer Schlüssel. Z.B. etwas wie das Folgende:

%Vor%

Beachten Sie, dass ich getOrElseUpdate hier nicht verwenden möchte, wenn dies nicht erforderlich ist, da es ziemlich ausführlich wird, wenn Sie Maps verschachtelt haben und verdecken, was im Code tatsächlich vor sich geht:

%Vor%

Also überschreibe ich die "Standard" -Methode von HashMap. Ich habe zwei Möglichkeiten ausprobiert, aber beides ist nicht vollständig zufriedenstellend. Meine erste Lösung bestand darin, eine Methode zu schreiben, die die Map erstellte, aber anscheinend muss ich noch den vollständigen verschachtelten Map-Typ angeben, wenn ich die Variable deklariere oder die Dinge nicht funktionieren:

%Vor%

Meine zweite Lösung bestand darin, eine Fabrikklasse mit einer Methode zu schreiben, und auf diese Weise muss ich jeden Typ nur einmal deklarieren. Aber jedes Mal, wenn ich eine neue Map mit Standardwerten möchte, muss ich die Factory-Klasse instanziieren und dann die Methode aufrufen, die immer noch ein wenig wortreich erscheint:

%Vor%

Ich möchte wirklich etwas so einfaches wie dieses haben:

%Vor%

Jeder sieht eine Möglichkeit, das zu tun?

    
Steve 06.07.2010, 15:01
quelle

2 Antworten

5

Mit Scala 2.8:

%Vor%

Sie können in Scala keine Typparameter eingeben, daher ist der Trick mit der Klasse zur Erfassung des Schlüsseltyps notwendig.

Übrigens: Ich denke nicht, dass die resultierende API sehr klar ist. Ich mag besonders den Seitenzugriff auf Karten nicht.

    
mkneissl 06.07.2010, 16:41
quelle
3

Stellt sich heraus, dass ich MapLike ebenfalls erweitern muss, oder wenn ich Filter, Map usw. anrufe, wird meine Map mit Standardwerten wieder in eine reguläre Map umgewandelt, ohne die Standard-Semantik. Hier ist eine Variante der Lösung von mkneissl, die das Richtige für Filter, Map, etc. tut.

%Vor%

Und hier, das ist in Aktion, das Richtige mit Filter zu tun:

%Vor%     
Steve 08.07.2010 10:35
quelle