在项目的 build.sbt 文件中添加以下配置来使用 zio
libraryDependencies += "dev.zio" %% "zio" % "1.0.0"
如果你想使用 ZIO streams,需要添加以下配置:
libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.0"
Contents
hide
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._
如果需要将文本打印到控制台,则可以使用 putStr
和 putStrLn
:
// 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