首页 > 解决方案 > Scala,ZIO - 如何从任务返回值?

问题描述

我有一个简单的理解代码:

def nameFormatter(request: SomeRequest) : FormattedData = {
      for {
        config <- ZIO.fromOption(configuration.get(request.name)).orElseFail( new Exception("Unknown config"))
        name = config.data.name.pipe(SomeName)
      } yield FormattedData(
        name,
        request.age
      )
    }

但是这个方法返回:

ZIO[Any, Exception, FormattedData]

我想将此方法更改为仅返回FormattedData,而不是整个 ZIO。可能吗?或者也许我应该以某种方式读取返回的类型并从中获取价值?

标签: scalazio

解决方案


ZIO 很难做到这一点,因为它不安全并且违背了使用 ZIO 的目的。您可以从类型中看出,如果您尝试实现该值ZIO[Any, Exception, FormattedData],它可能会失败。Exception

如果你真的想这样做:

zio.Runtime.default.unsafeRun(nameFormatter(request))

否则,您应该使用以下结果编写其余代码并使用以下内容nameFormatter(request)运行它:

import zio.{ExitCode, URIO, ZIO}

object Main extends zio.App {
  override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] =
    (for {
      formattedData <- nameFormatter(request)
      // rest of your code
    } yield ()).exitCode
}

推荐阅读