Wie deklariert man Tupel als Rückgabetyp einer Funktion und wie kann man in scala auf das Tupel im Caller-Code zugreifen?

7

Angenommen, ich habe eine Scala-Funktion, die ein Tupel vom Typ zurückgeben soll (String, Int, Int) mapped to keys (words, row, col) :

%Vor%

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%     
rjc 05.07.2011, 15:56
quelle

5 Antworten

3

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%     
Shadowlands 06.07.2011, 06:59
quelle
19

Mehrfache Zuweisung kann in einer syntaktisch einfachen Art durchgeführt werden ( was wie folgt auf die unapply -Methoden der Tuple-Typen zurückgeht:

%Vor%

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).

    
Andrzej Doyle 05.07.2011 16:01
quelle
6

Zuerst müssen Sie entscheiden, ob Sie eine Karte benötigen.

Vielleicht möchten Sie eine Karte, weil

  1. Sie erhalten jedes Mal andere Schlüssel / Wert-Paare
  2. Sie haben viele Schlüssel-Wert-Paare ungeschickt und müssen sie durchlaufen, um sie zu verwalten
  3. Sie haben Schlüsselwerte als Daten , nicht nur als Teil Ihres Codes, und müssen den entsprechenden Wert
  4. abrufen

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:

%Vor%

und Sie können alles oben tun, außer die positionsbasierten Namen zu verwenden:

%Vor%     
Rex Kerr 05.07.2011 18:06
quelle
5

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

    
Dan Simon 05.07.2011 16:11
quelle
1

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: Ссылка

    
paradigmatic 05.07.2011 16:24
quelle

Tags und Links