Scala、ZIO - 如何从任务返回值?

all*_*cer 2 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
      )
    }
Run Code Online (Sandbox Code Playgroud)

但这个方法返回:

ZIO[Any, Exception, FormattedData]
Run Code Online (Sandbox Code Playgroud)

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

yan*_*zai 6

ZIO 使执行此操作变得困难,因为它不安全并且违背了使用 ZIO 的目的。您可以从类型中看出,如果您尝试具体化该值,ZIO[Any, Exception, FormattedData]它可能会失败。Exception

如果你真的想这样做:

zio.Runtime.default.unsafeRun(nameFormatter(request))
Run Code Online (Sandbox Code Playgroud)

否则,您应该使用以下结果编写其余代码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
}
Run Code Online (Sandbox Code Playgroud)