【问题标题】:Scala, ZIO - how to return value from Task?Scala,ZIO - 如何从任务返回值?
【发布时间】:2021-09-24 05:03:16
【问题描述】:

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

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

【问题讨论】:

  • 请问,为什么要返回一个纯值?与第三方服务集成?你为什么要使用 ZIO,因为它来自第三方库?你了解IO 数据类型的用途吗?
  • 我要纯值,因为这里不需要效果
  • 那么为什么还要使用 ZIO 呢?为什么不直接 configuration.get(request.name).map(config =&gt; FormattedData(name = config.data.name.pipe(SomeName), age = request.age) 并返回 Option[FormattedData]

标签: scala zio


【解决方案1】:

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
}

【讨论】:

    【解决方案2】:

    使用方法是

    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 ()
    

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

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 2021-07-17
      • 2020-01-30
      • 2016-11-17
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2017-08-02
      相关资源
      最近更新 更多