2017-10-15 5 views
0

Es tritt ein Problem auf, bei dem ich private Konstanten am Anfang einer Scala-Schrittdefinitionsdatei festlege, die auf einem zu füllenden Listenpufferelement basiert 'IndexOutOfBoundsException', weil die Liste anfänglich leer ist und erst später in einer for-Schleife gefüllt wird. Zum Beispiel habe ich die folgenden zwei Konstanten:Zugriff auf Konstanten, die auf einen aufzulösenden Listenpuffer angewiesen sind. Scala

private val ConstantVal1= globalExampleList(2) 
private val ConstantVal2= globalExampleList(3) 

globalExampleList weiter aufgefüllt wird unten in der Datei für Schleife eine Verwendung:

for (i <- 1 to numberOfW) { 
    globalExampleList += x.xy } 

Diese Liste Buffer so viele Werte addiert zu einem globalen wandelbar erforderlich Listenpuffer.

Gibt es eine bessere Möglichkeit, diese Konstanten zu deklarieren? Ich habe versucht, sie nach der for-Schleife zu deklarieren, aber andere Methoden sind nicht in der Lage, auf diese zuzugreifen. Ich habe ungefähr 4 verschiedene Methoden innerhalb derselben Datei, die diese Werte verwenden, und statt jedes Mal über Index darauf zuzugreifen, dachte ich, es wäre besser, sie als eine Konstante zu deklarieren, um sie ordentlich und effizient zu halten, wenn sie geändert werden müssen.

Dank

Antwort

1

Sie können Listenpuffer der notwendigen Größe mit Standardwert erstellen und es später füllen:

val globalExampleList: ListBuffer[Int] = ListBuffer.fill(numberOfW)(0) 

for (i <- 0 until numberOfW) { 
    globalExampleList(i) = x.xy 
} 

Aber ConstantVal1, ConstantVal2 hat noch ursprünglichen Standardwert. So können Sie sie var s machen und sie neu zuweisen, nachdem Sie den Puffer auffüllen.

Ihr Code scheint viele Mutationen und Nebenwirkungen zu haben.

+0

danke :) gibt es einen besseren Weg ohne die Mutationen und Nebenwirkungen, aber immer noch das gleiche Ergebnis zu erzielen. Ich lerne immer noch den besten Weg, in Scala zu programmieren, also wäre jede Information großartig, von der ich lernen könnte – user610

1

Sie haben 2 Möglichkeiten zu gehen. Zuerst kann man lazy Modifikator

private lazy val ConstantVal1= globalExampleList(2) 
private lazy val ConstantVal2= globalExampleList(3) 

verwenden, oder Sie können die beiden Linien nach der for Schleife schreiben.

val globalExampleList = XXXX 
for (i <- 1 to numberOfW) { globalExampleList += x.xy } 
private val ConstantVal1= globalExampleList(2) 
private val ConstantVal2= globalExampleList(3) 
Verwandte Themen