2010-05-05 10 views
21

Ich bin neu in Scala, und lief über einen kleinen Schluckauf, der mich nervte.Scala Tuple Dekonstruktion

initialisieren zwei Vars parallel Werke groß: var (x,y) = (1,2)

Allerdings kann ich nicht einen Weg finden, um neue Werte parallel zu: (x,y) = (x+y,y-x) //invalid syntax

ich etwas am Ende wie folgt zu schreiben: val xtmp = x+y; y = x-y; x = xtmp

Ich weiß, dass das Schreiben von funktionalem Code eine Möglichkeit ist, dies zu vermeiden, aber es gibt bestimmte Situationen, in denen vars nur mehr Sinn macht.

Ich habe zwei Fragen:

1) Gibt es einen besseren Weg, dies zu tun? Fehle ich etwas?

2) Was ist der Grund dafür, dass keine echte parallele Zuweisung möglich ist?

+5

siehe https://lampsvn.epfl.ch/trac/scala/ticket/1324 –

+0

@Seth Tisue, danke, aber das ist ein trauriger Link - ein WONTFIX :-( – greenoldman

Antwort

21

Leider können Sie in Scala nicht mehrere Aufgaben übernehmen. Sie können aber Tupeln verwenden, wenn sie Ihr Problem passen:

scala> var xy = (1,2) 
xy: (Int, Int) = (1,2) 

scala> xy = (xy._1 + xy._2, xy._2 - xy._1) 
xy: (Int, Int) = (3,1) 

Auf diese Weise xy ist ein Tupel mit zwei Werten. Der erste Wert kann über xy._1 erreicht werden, der zweite über xy._2.

0

Scala hat zwei Arten von Variablen: Vals und Vars. Vals sind ähnlich wie Java endgültigen Variablen, so weit, wie ich sie verstehe, was Sie fragen, ist der einzige Weg, um neue Werte parallel zu vals zuzuordnen ist durch:

scala> val (x, y) = (1, 2); 

oder

scala> val s = (3, 4); 
s: (Int, Int) = (3,4) 

scala> s._1 
res1: Int = 3 

scala> s._2 
res2: Int = 4 
+1

Ich verstehe, warum Sie nicht können erstelle einen neuen Wert für ein val. Ich spreche von der parallelen Zuweisung von vars. Im Code von meiner Frage sind x und y beide vars. – dbyrne

+5

Er fragt, ob du 'val (x, y) = (1,2) 'und' var (x, y) = (1,2) 'warum kannst du dann nicht' var x; var y; (x, y) = (1,2) '? –