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

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方法不会自动添加换行符:

  1. 第一次调用Console.print("Message")后,光标停留在同一行末尾,你输入的内容会直接跟在"Message"后面显示,而非新行
  2. 读取输入后调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:52:13