运行 Effects

ZIO 提供了多种不同的方式在您的应用程序中运行您的 effect。

App

如果您将整个程序构建一个 effect,那么运行 effect 的最自然的方法是扩展zio.App

此类提供了 Scala 的 main 函数,因此可以从IDE调用它,或从命令行启动它。您所需要做的就是实现 run 方法,命令行参数被保存在 List 中作为参数传递给它:

import zio._
import zio.console._

object MyApp extends zio.App {

  def run(args: List[String]) =
    myAppLogic.exitCode

  val myAppLogic =
    for {
      _    <- putStrLn("Hello! What is your name?")
      name <- getStrLn
      _    <- putStrLn(s"Hello, ${name}, welcome to ZIO!")
    } yield ()
}

如果您自定义了应用程序的环境,则必须(使用 ZIO#provide来)为您的 effect 的 run 函数提供环境,因为您(自定义的)的 App不知道如何将自定义的环境提供给 effect。

缺省的运行时

大多数应用程序不是全新的,必须与遗留代码,过程库和框架集成。

在这些情况下,更好解决方案是创建一个运行时,将其传递给需要运行 effect 的地方。

ZIO 包含一个名为 Runtime.default 的默认运行时。此运行时将所有 ZIO 提供的模块的实现(包括 ConsoleSystemClockRandomScheduler以及在 JVM 上的 Blocking)捆绑在一起,并且可以运行需要这些模块任意组合的 effect。

要使用这个运行时,只需使用:

val runtime = Runtime.default

一旦您获得了一个运行时,你就可以将它用于执行您的 effect:

runtime.unsafeRun(ZIO(println("Hello World!")))

除了unsafeRun方法之外,还有其他方法可以异步执行 effect 或将其转换为Future

定制 Runtime

如果您使用自定义环境运行程序,那么创建专门针对该环境量身定制的运行时可能会很有用。

以下两个值用来创建自定义的 custom Runtime[R]

  • R Environment. 这是执行 effect 时将提供的环境。This is the environment that will be provided to effects when they are executed.
  • Platform. 这是 ZIO 启动运行时系统所需的平台。

例如,以下代码使用 ZIO 提供的默认平台创建了一个可以将 Int 作为环境值提供给effect 的运行时:

import zio.internal.Platform

val myRuntime: Runtime[Int] = Runtime(42, Platform.default)

错误报告

作为运行时的一部分,每一个 platform 都包含一个错误报告程序,ZIO 将调用该错误报告程序以报告每个未经处理的错误。提供您自己的错误报告程序是个好主意,比如可以将未处理的错误记录到文件中。

默认的未处理错误报告器仅将错误输出到标准错误输出。

Next Steps

如果您对运行效果感到满意,那就恭喜!

现在,您可以学习 ZIO 网站的其他部分,包括数据类型,用例以及与其他系统的互操作。.

有关所有核心 ZIO 类型和方法的详细文档,请参考 Scaladoc。

Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP