Angenommen, ich habe eine Scala-Funktion, die ein Tupel vom Typ zurückgeben soll
(String, Int, Int) mapped to keys (words, row, col)
:
Im Anrufercode:
%Vor%Der Code ist unvollständig. Also, wie würde ich das Tupel in der Funktion deklarieren und zurückgeben und wie würde ich im obigen Szenario verwenden?
Ist Tupel im obigen Fall empfohlen, obwohl die Karte besser passt?
Trotz aller Antworten habe ich keine Antwort auf die Frage gegeben, wie ich das Tupel deklariere und das Tupel später im Code befülle (Tupelwerte werden zu der Zeit nicht deklariert, wie diese Antwort suggeriert:
%Vor%Dies ist der Teil des Codes, der unbeantwortet bleibt:
%Vor%Habe ich recht, wenn ich annehme, dass Sie zuerst Ihre Ergebnisvariablen deklarieren wollen (und auf sie außerhalb des if / else-Konstrukts zugreifen müssen), dann Code aufrufen, der sie setzt und verwendet (innerhalb des if / else-Konstrukts)? Wenn ja, sollte es so einfach wie
sein %Vor% Mehrfache Zuweisung kann in einer syntaktisch einfachen Art durchgeführt werden ( was wie folgt auf die unapply
-Methoden der Tuple-Typen zurückgeht:
Daher können Sie das letzte Beispiel einfach in
ändern %Vor% Die if
-Anweisung gibt ein (String, Int, Int)
zurück und die relevanten Komponenten werden words
, row
und col
der Reihenfolge nach zugeordnet.
Wenn Sie gefragt haben, wie Sie Ihre Methodendeklaration mit dem Rückgabetyp versehen können, ist das auch einfach:
%Vor%Ob es als Karte besser ist - das hängt ganz von der Semantik Ihrer Methode ab. Geben Sie mehrere Werte gleichzeitig zurück (ein Tupel) oder geben Sie eine Verknüpfung zwischen Schlüsseln und Werten zurück (eine Map)? Was auch immer sich am natürlichsten und bequemsten anfühlt, ist derjenige, den Sie verwenden sollten (zumindest in Ermangelung anderer Bedenken).
Zuerst müssen Sie entscheiden, ob Sie eine Karte benötigen.
Vielleicht möchten Sie eine Karte, weil
Bisher sieht es nicht so aus, als wäre eines dieser drei Dinge der Fall. Sie brauchen also nicht wirklich eine Karte , Sie brauchen nur einen Namen für Ihre verschiedenen Datentypen. (Das heißt, Sie können zulassen, dass der Compiler die Zuordnung zwischen Ihrem Namen und den entsprechenden Daten übernimmt.)
Der direkteste Weg, benannte Werte zu erhalten, ist eine Fallklasse:
%Vor%Sie können dies zurückgeben:
%Vor%Sie können dies zuweisen:
%Vor%und sieh dir die Teile an:
%Vor%Sie können den Teilen separate Variablen zuweisen:
%Vor%Sie können eine Musterübereinstimmung finden, um Teilantworten zu finden:
%Vor%Sie können kopieren und nach Namen ändern:
%Vor%und so weiter.
Wenn Sie keine Namen benötigen, können Sie Tupel verwenden, die auf die gleiche Weise funktionieren, aber nur die Position der Argumente kennen. Der erste Eintrag heißt _1
, der zweite _2
und so weiter. Sie geben diese einfach an, indem Sie die Elemente in Klammern angeben:
und Sie können alles oben tun, außer die positionsbasierten Namen zu verwenden:
%Vor%Tupel als Rückgabewerte sind nützlich, wenn Sie eine Funktion haben, die mehr als einen Wert zurückgeben muss und diese Werte nicht als Struktur zusammenbleiben müssen (wenn sie zusammenbleiben müssen, wäre es sinnvoller, sie zu verwenden) Definieren Sie eine einfache Fallklasse).
Um eine Funktion mit einem 3-Tupel als Rückgabetyp zu deklarieren und ein 3-Tupel zurückzugeben, würden Sie Folgendes tun:
%Vor%Dies ist eigentlich syntaktischer Zucker für:
%Vor%Scala hat TupleN-Klassen für N: 1 bis 22
Tupel sind OK, aber Sie können auch die Fallklasse berücksichtigen:
%Vor%Es ist unveränderlich und hat viele nützliche Funktionen. Ich bevorzuge Fallklasse vor Tupeln, weil Felder nützliche Namen haben. Erfahren Sie hier darüber: Ссылка
Tags und Links scala