Cambio de valor de una lista antes de ser devuelta – scala.
clase test{
import io.Source
import scala.util._
val pathname = "XXXYYY.csv"
val open = Source.fromFile(pathname).getLines
def agregarElementos(lista: List[String]) : List[String] = {
def agregarElementosRecursividad(lista: List[String]) : List[String] = {
while(open.hasNext){
val tmpVal = open.next()
val nuevaLista = lista:+tmpVal
agregarElementosRecursividad(nuevaLista)
}
println(lista)
lista
}
agregarElementosRecursividad(lista)
}
}
val obj = new test()
val lista1 = List()
obj.agregarElementos(lista1)
davy.ai
La razón por la que el resultado final no es List(1,2) es porque el bucle
while
en la funciónaddElementsRecursion
está reemplazandoopen
con la próxima línea cada vez que se llama. Entonces, cuando llega al final del archivo y el buclewhile
se sale,open
ya está al final del archivo y llamaropen.hasNext
nuevamente devolverá falso, peroopen.next()
seguirá devolviendo un valor (una cadena vacía en este caso) ytmpVal
se agregará alist
antes de imprimirlo. Por eso la salida es List(1, 2), List(1), List().Para solucionar esto, puedes mover la inicialización de
open
dentro de la funciónaddElementsRecursion
para que se llame cada vez que la función se llame recursivamente. Esto reiniciaráopen
al principio del archivo cada vez y evitará el problema de obtener una cadena vacía cuando se llame aopen.next()
al final del archivo. Aquí tienes el código modificado:Con esta modificación, la salida será List(1, 2) como se espera.