Getting Started

在项目的 build.sbt 文件中添加以下配置来使用 zio

libraryDependencies += "dev.zio" %% "zio" % "1.0.0"

如果你想使用 ZIO streams,需要添加以下配置:

libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.0"

Main

您的应用程序可以扩展自App,它提供一个完整的运行时(runtime)系统,并允许您使用 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 ()
}

run 方法应返回一个 ZIO 值,该值包括负责处理所有的错误, 在 ZIO 的术语环境中,它代表一个不会产生异常的 ZIO 值。

一种实现方法是在 ZIO 值上调用 fold,以获的非异常的 ZIO 值。这需要两个具柄函数:eh: E => B(错误处理具柄),和 ah: A => B(成功处理具柄)。

如果 myAppLogic 失败,则将使用 eh 从 e: E 获得 b: B;如果成功,则将使用 ah 从 a: A 获得 b: B

以上为例,myAppLogic 产生一个非异常的 ZIO 值,其中 B 为 Int。 如果 myAppLogic 失败,将得到 1;否则如果成功,则将得到 0。


如果要使用依赖注入,将 ZIO 集成到现有应用程序中,或者不打算直接编写 main 函数,那么可以显式创建运行时(runtime)以执行 ZIO 程序:

import zio._

object IntegrationExample {
  val runtime = Runtime.default

  runtime.unsafeRun(Task(println("Hello World!")))
}

理想情况下,您的应用程序应该只有一个运行时,因为每个运行时都有自己的资源(包括线程池和未处理的错误报告)。

控制台(Console)

ZIO 提供了用于与控制台进行交互的模块。您可以使用以下代码片段将此模块中的功能导入.

import zio.console._

如果需要将文本打印到控制台,则可以使用 putStrputStrLn:

// Print without trailing line break
putStr("Hello World")
// res8: URIO[Console, Unit] = zio.ZIO$Read@c8d30bd

// Print string and include trailing line break
putStrLn("Hello World")
// res9: URIO[Console, Unit] = zio.ZIO$Read@6282bfa3

如果需要从控制台读取输入,则可以使用 getStrLn:

val echo = getStrLn.flatMap(line => putStrLn(line))
// echo: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$FlatMap@550af253
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP