2010-03-14 8 views
5

Le code Scala suivant répond exactement à mes attentes: il imprime chaque ligne de some_file.txt.Scala println dans une boucle for

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

Si j'utilise println au lieu d'imprimer, je voir some_file.txt imprimé à double interligne. Au lieu de cela, le programme imprime une nouvelle ligne après chaque caractère de some_file.txt. Quelqu'un pourrait-il m'expliquer cela? J'utilise Scala 2.8.0 Beta 1.

Répondre

23

lines est une chaîne unique, pas un conteneur de chaînes itérable. C'est parce que vous avez appelé la méthode .mkString dessus. Lorsque vous faites une itération sur une chaîne, vous le faites un caractère à la fois. Donc le line dans votre for n'est pas réellement une ligne, c'est un seul caractère.

Qu'est-ce que vous avez probablement l'intention de faire appel a été .getLines au lieu de .mkString

+0

Il a appelé '.mkString' sur le résultat de' fromPath', qui est un 'Iterator [Char]' avec quelques éléments ajoutés. Je sais que vous le savez, mais je pense que vous pourriez le rendre plus clair. Vous pouvez aussi mettre un exemple de compréhension pour un littéral 'String'. –

2

Je soupçonne que for (line <- lines) print(line) ne met pas une ligne dans line mais plutôt un caractère. Faire la sortie comme prévu puisque le \n est là aussi. Lorsque vous remplacez le print par println chaque personnage obtient sa propre ligne.

Questions connexes