Scala中使用scanLeft读取标准输入时输出滞后一行的问题
解决scanLeft处理stdin时输出滞后一行的问题
我懂你碰到的这个困扰——用scanLeft处理标准输入时,输出总是比输入慢一拍,这其实是scanLeft的特性和getLines的惰性求值共同造成的。
问题根源
scanLeft的工作逻辑是先返回初始累积值,之后每处理一个输入元素,才返回一次更新后的累积结果。而io.Source.stdin.getLines是惰性读取的,当你调用foreach(println)时:
- 第一次迭代直接输出初始值
START:,这时候程序还没读取任何输入; - 接着才会等待你输入第一行,处理后得到
START: first,但这个结果要等到下一次foreach迭代才会输出; - 以此类推,就出现了输入和输出滞后一行的情况。
修正方案
只需要取scanLeft结果的尾部(tail),跳过那个还没处理任何输入的初始累积值,就能让输出和输入完全同步:
io.Source.stdin.getLines.scanLeft("START:")((accu, line) => accu + " " + line).tail.foreach(println)
测试一下效果:
first → START: first
second → START: first second
third → START: first second third
这样就完全符合你的预期了!
内容的提问来源于stack exchange,提问作者alpinist
相关产品推荐
相关产品推荐

