2010-03-14 8 views
5

El siguiente código Scala hace exactamente lo que yo esperaba: imprime cada línea de some_file.txt.Scala println en un bucle for

import scala.io.Source 
val lines = Source.fromPath("some_file.txt").mkString 
for (line <- lines) print(line)  

si uso PRINTLN en lugar de impresión, espero ver some_file.txt impreso con doble espacio. En cambio, el programa imprime una nueva línea después de cada carácter de algún_archivo.txt. ¿Podría alguien explicarme esto? Estoy usando Scala 2.8.0 Beta 1.

Respuesta

23

lines es una cadena única, no un contenedor de cadenas iterable. Esto se debe a que llamaste al método .mkString.

Cuando itera sobre una cadena, lo hace un carácter a la vez. Entonces, el line en su for no es en realidad una línea, es un solo carácter.

Lo que probablemente la intención de hacer era llamada .getLines en lugar de .mkString

+0

Llamó '.mkString' al resultado de' fromPath', que es un 'Iterator [Char]' con algunas cosas adicionales. Sé que lo sabes, pero creo que podrías aclararlo. También podría poner un ejemplo de a para la comprensión sobre un literal 'String'. –

2

Sospecho que for (line <- lines) print(line) no pone una línea en line pero en lugar de un carácter. Haciendo la salida como se esperaba ya que el \n está allí también. Cuando reemplaza el print con println, cada personaje obtiene su propia línea.