You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中使用scanLeft读取标准输入时输出滞后一行的问题

解决scanLeft处理stdin时输出滞后一行的问题

我懂你碰到的这个困扰——用scanLeft处理标准输入时,输出总是比输入慢一拍,这其实是scanLeft的特性和getLines的惰性求值共同造成的。

问题根源

scanLeft的工作逻辑是先返回初始累积值,之后每处理一个输入元素,才返回一次更新后的累积结果。而io.Source.stdin.getLines是惰性读取的,当你调用foreach(println)时:

  1. 第一次迭代直接输出初始值START:,这时候程序还没读取任何输入;
  2. 接着才会等待你输入第一行,处理后得到START: first,但这个结果要等到下一次foreach迭代才会输出;
  3. 以此类推,就出现了输入和输出滞后一行的情况。

修正方案

只需要取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:51