gpt4 book ai didi

Scala:从标准输入读取时扫描左一项

转载 作者:行者123 更新时间:2023-12-04 14:23:04 25 4
gpt4 key购买 nike

如果我处理来自 stdin 的输入与 scanLeft ,结果输出总是在我最后一个输入后面一行:

io.Source.stdin
.getLines
.scanLeft("START:")((accu, line) => accu + " " + line)
.foreach(println(_))

结果(我的手动输入以 > 开头):
> first
START:
> second
START: first
> third
START: first second

我想要的合理输出是:
> first
START: first
> second
START: first second
> third
START: first second third

如您所见,第一个输入行后面的输出应该已经包含第一个输入行的字符串。

我已经用 .scanLeft(...).drop(1).foreach(...) 试过了,但这会导致以下结果:
> first
> second
START: first
> third
START: first second

如何正确省略纯种子以获得所需的结果?

[更新]
目前,我对 Andrey Tyukin 巧妙的解决方法感到满意。非常感谢您的建议。

但当然,如果有任何替代scanLeft不会将种子作为第一项发送到以下迭代链中,我更喜欢该解决方案。

[更新]

用户 jwvh 理解我的目标并提供了一个很好的解决方案。为了完善他们的建议,我寻求一种在将它们发送到累积回调之前对这些行进行预处理的方法。因此readLine命令不应在累积回调中调用,而是在我可以添加的不同链链接中调用。

最佳答案

编辑摘要:添加了 map证明 getLines 返回的行的预处理是微不足道的。

你可以搬家 println进入scanLeft的 body 本身,强制立即执行而没有滞后:

io.Source.stdin
.getLines
.scanLeft("START:") {
(accu, line) => accu + " " + line
val res = accu + " " + line
println(res)
res
}.foreach{_ => }

然而,这似乎与更短、更直观的 foldLeft 的行为完全相同。 :
io.Source.stdin
.getLines
.foldLeft("START:") {
(accu, line) => accu + " " + line
val res = accu + " " + line
println(res)
res
}

示例交互:
first
START: first
second
START: first second
third
START: first second third
fourth
START: first second third fourth
fifth
START: first second third fourth fifth
sixth
START: first second third fourth fifth sixth
seventh
START: first second third fourth fifth sixth seventh
end
START: first second third fourth fifth sixth seventh end

编辑

您当然可以添加 map - 预处理行的步骤:
io.Source.stdin
.getLines
.map(_.toUpperCase)
.foldLeft("START:") {
(accu, line) => accu + " " + line
val res = accu + " " + line
println(res)
res
}

交互示例(键入小写,打印大写):
> foo
START: FOO
> bar
START: FOO BAR
> baz
START: FOO BAR BAZ

关于Scala:从标准输入读取时扫描左一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49417774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com