ZIO合并3个Console效果异常:仅输出一行Message问题排查
ZIO Console 打印输入值不显示问题排查
问题场景
我想要实现一个依次合并3个Console效果的功能:先向控制台打印内容,读取输入值,再将该值打印到控制台。代码如下:
object ZioMain extends ZIOAppDefault { override def run: IO[IOException, Unit]= { def printReadPrint(): IO[IOException, Unit] = Console.print("Message") .flatMap(_ => Console.readLine) .flatMap(v => Console.print(v)) printReadPrint() } }
预期输出:
Message Message
实际输出:
Message
问题原因
核心问题在于Console.print方法不会自动添加换行符:
- 第一次调用
Console.print("Message")后,光标停留在同一行末尾,你输入的内容会直接跟在"Message"后面显示,而非新行 - 读取输入后调用
Console.print(v),同样不会添加换行,导致输入值和之前的内容或输入提示符在同一行,视觉上只呈现一行输出
解决方法
有两种修改方式可以达到预期效果:
方式1:使用Console.printLine替代Console.print
printLine会自动在输出内容末尾添加换行符,确保每次输出后光标进入新行:
object ZioMain extends ZIOAppDefault { override def run: IO[IOException, Unit]= { def printReadPrint(): IO[IOException, Unit] = Console.printLine("Message") .flatMap(_ => Console.readLine) .flatMap(v => Console.printLine(v)) printReadPrint() } }
方式2:手动添加换行符
如果坚持使用Console.print,可以手动在内容后拼接\n换行符:
object ZioMain extends ZIOAppDefault { override def run: IO[IOException, Unit]= { def printReadPrint(): IO[IOException, Unit] = Console.print("Message\n") .flatMap(_ => Console.readLine) .flatMap(v => Console.print(v + "\n")) printReadPrint() } }
修改后运行代码,输入"Message"并回车,就能得到预期的两行输出。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

