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

eqzww0vc  于 2023-01-05  发布在  Scala
关注(0)|答案(3)|浏览(155)

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

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。这可能吗?或者我应该读取返回的类型并从中获取值?

yhived7q

yhived7q1#

ZIO使这一点变得困难,因为它是不安全的,而且它违背了使用ZIO的目的。从类型ZIO[Any, Exception, FormattedData]可以看出,如果您试图物化值,它可能会失败。
如果你真的想这么做:

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
}
hyrbngr7

hyrbngr72#

使用方法是

nameFormatter(request).flatMap { formattedData =>
  // whatever you want to do with the returned value
  // ...
  // the rest of your program
}

或者在一个理解中:

for {
  formattedData <- nameFormatter(request)
  // rest of your program
} yield ()

没有回答您的问题,但这可能是您想要做的。

ztmd8pv5

ztmd8pv53#

从ZIO 2.0开始,不安全的运行效果会像这样:

zio.Runtime.default.unsafe.run(nameFormatter(request))

为了工作,需要提供一个隐式参数unsafe: zio.Unsafe,可以这样做:

Unsafe.unsafe(implicit u => zio.Runtime.default.unsafe.run(nameFormatter(request)))

请参阅文档:https://zio.dev/reference/core/runtime/#running-a-zio-effect

相关问题