2017-10-15 26 views
0

Je rencontre un problème en spécifiant des constantes privées au début d'un fichier de définition d'étape scala qui repose sur un élément de liste tampon à remplir, mais lors de la compilation, je reçois un 'IndexOutOfBoundsException' car la liste est initialement vide et n'est remplie que plus tard dans une boucle for. Par exemple, j'ai les 2 constantes suivantes:Accès aux constantes qui reposent sur un tampon de liste à renseigner Scala

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

globalExampleList est peuplé plus bas dans le fichier en utilisant une boucle:

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

Cette liste tampon ajoute autant de valeurs que nécessaire à un mutable mondial ListBuffer.

Existe-t-il un meilleur moyen de déclarer ces constantes? J'ai essayé de les déclarer après la boucle for mais d'autres méthodes ne sont pas capables d'y accéder. J'ai environ 4 méthodes différentes dans le même fichier qui utilisent ces valeurs et au lieu d'y accéder par index chaque fois que je pensais qu'il serait préférable de les déclarer comme une constante pour le garder propre et efficace pour chaque fois qu'ils ont besoin de changer.

Merci

Répondre

1

Vous pouvez créer un tampon de liste de la taille nécessaire avec la valeur par défaut et le remplir plus tard:

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

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

Mais ConstantVal1, ConstantVal2 auront toujours la valeur par défaut d'origine. Vous pouvez donc les rendre var et les réassigner après avoir rempli le tampon.

Votre code semble avoir beaucoup de mutations et d'effets secondaires.

+0

merci :) est-il un meilleur moyen sans les mutations et les effets secondaires, mais atteindre le même résultat. Je suis encore en train d'apprendre la meilleure façon de coder en Scala donc toute information serait géniale à apprendre de – user610

1

Vous avez 2 façons de procéder. D'abord, vous pouvez utiliser lazy modificateur

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

Ou vous pouvez écrire les deux lignes après la boucle for.

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