2016-03-29 4 views
0

Ich versuche, um die Liste der Intervalle zu erzeugen, die nicht in einer vorgegebenen Liste von 1 beginnend enthalten Also habe ich den Code geschrieben, wie unten dargestellt:Scala errors- Vorwärts-Referenz erstreckt sich über Definition von Wert

def comparatorInt(first: (Int,Int), second: (Int, Int)) = first._2 <= second._1 

val list1 = List((93,97), (5,10),(15,20),(30,50), (76,90)).sortWith(comparatorInt) 

var curr = 1 
val res = for(x <- list1; tmp = curr; curr = x._2+1) yield(tmp,x._1-1) 

hier erhalte ich einen Compiler-Fehler

Fehler: vorwärts-Referenz erstreckt sich über Definition von Wert tmp

faul val res = für (x < - list1; tmp = c urr; curr = x._2 + 1) yield (tmp, x._1-1)

Ich bin nicht in der Lage, die Lösung für das Problem zu finden. Bitte schlagen Sie eine Lösung für das gleiche vor.

Antwort

1

Die andere Antwort erklärt gut genug, warum Sie den Fehler erhalten. Ich wollte nur hinzufügen: Verwenden Sie nicht var, Sie brauchen sie die meiste Zeit nicht. Wenn Sie in scala schreiben könnte genauso gut die Vorteile der Kraft der Sprache nehmen und idiomatische bleiben, anstatt nur alte Java-Code mit lustigen Syntax zu schreiben :) etwas wie folgt vor:

((0,0) :: list1).foldRight(List.empty[(Int,Int)]) { 
    case([email protected](a, b), [email protected]((c, d) :: tail)) if(b < c-1) => x :: (b+1, c-1) :: res 
    case(x, res) => x :: res 
    }.tail 

(neben nicht einen Kompilierungsfehler verursacht, funktioniert diese Version auch anders als Ihre, die logische Fehler hat;)).

+0

Vielen Dank, genau das habe ich gebraucht. Ich bin immer noch neu in Scala, also versuche so viel wie möglich zu lernen ... werde versuchen, mit deinem Ratschlag fortzufahren. :) –

+0

Es wird sehr hilfreich sein, wenn Sie einige Links vorschlagen können, um die erweiterte Funktion von scala zu erlernen, da ich sonst nur über solche Methoden Bescheid weiß, wenn ich versuche, ein Problem zu lösen. –

2

Die curr in der for Verständnis ist nicht die gleiche wie Ihre var. Was Sie geschrieben entspricht

var curr = 1 
val res = for(x <- list1; tmp = anotherCurr; anotherCurr = x._2+1) yield(tmp,x._1-1) 

so dass der Compiler sieht, dass Sie versuchen, temp zu definieren, bevor Sie anotherCurr definiert, daher der Fehler. Wenn Sie die var ändern möchten, können Sie dies nach der Operation yield tun.

+0

IntelliJ hat einen netten Code-Analysator, der diese Art von Sache sehr leicht finden wird. Ich bin ein langjähriger Eclipse-Benutzer, aber IntelliJ ist viel besser für Scala. – Phasmid

Verwandte Themen