Scala for Backend Engineering & Functional Programming · 课时

运行 ZIO 应用

ZIOAppDefault

第 4 / 4 课13 个步骤

运行 ZIO 应用 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

从描述到执行

一个 ZIO 值只是一个蓝图。要执行它,您需要将它交给 ZIO 运行时,通常是扩展 ZIOAppDefault,而不是手动调用运行时。

ZIOAppDefault

扩展 ZIOAppDefault 并实现 run。框架会提供默认服务(Console、Clock、Random、System),并管理启动和关闭。

import zio._

object Hello extends ZIOAppDefault {
  def run = Console.printLine("Hello, ZIO!")
}

run 值

run 是一个环境由默认服务满足的 ZIO。它的错误类型和成功类型都很灵活;运行时会报告失败并设置退出代码。

多步骤应用

使用 for 推导式组合应用逻辑。每一行都是一个由运行时按顺序执行的效果。

import zio._

object Greeter extends ZIOAppDefault {
  def run = for {
    _    <- Console.printLine("What is your name?")
    name <- Console.readLine
    _    <- Console.printLine(s"Hello, $name!")
  } yield ()
}

在 run 中提供层

如果应用依赖自定义服务,请在 run 效果上使用 provide 提供相应的层,以便在执行前完全满足环境需求。

import zio._

object App extends ZIOAppDefault {
  // def run = program.provide(MyService.layer)
  def run = ZIO.unit
}

退出代码

默认情况下,成功的 run 会以代码 0 退出,失败则以非零代码退出。您也可以使用 exitCode 返回明确的 ExitCode。

import zio._

object App extends ZIOAppDefault {
  def run = Console.printLine("done").exitCode
}

命令行参数

通过 ZIOApp.args 或 getArgs 使用 ZIOAppArgs 访问程序参数,返回一个 Chunk[String]。

import zio._

object App extends ZIOAppDefault {
  def run = for {
    args <- getArgs
    _    <- Console.printLine(s"args: ${args.mkString(", ")}")
  } yield ()
}

在边界处处理失败

良好的实践是在顶层处理或记录错误,以便运行时打印清晰的消息。在 run 中使用 catchAll 或 tapError。

import zio._

object App extends ZIOAppDefault {
  val logic = ZIO.fail("oops")
  def run = logic.catchAll(e => Console.printLine(s"Failed: $e"))
}

派生纤程

在 run 中,您可以使用 fork 将效果派生到纤程上以实现并发,之后再使用 join 等待它们。运行时会监管所有纤程,并在关闭时中断它们。

import zio._

val prog = for {
  fiber  <- ZIO.succeed(40).fork
  result <- fiber.join
  _      <- Console.printLine(s"got $result")
} yield ()

手动不安全运行

在 ZIOAppDefault 之外,您可以使用 Unsafe.unsafe 和 Runtime 运行效果,但这仅用于集成边界,不应在常规应用代码中使用。

import zio._

// Unsafe.unsafe { implicit u =>
//   Runtime.default.unsafe.run(myEffect).getOrThrow()
// }

普通 Scala 主程序

作为对比,这是一个自包含的 Scala 程序入口点。ZIOAppDefault 扮演 main 的角色,同时接入服务、错误报告和纤程监管。

object Main {
  def main(args: Array[String]): Unit = {
    println("Hello, ZIO!")
  }
}

快速检查

运行 ZIO 应用的推荐方式是什么?

回顾

您学会了运行 ZIO 应用:

  • 使用带有 run 效果的 ZIOAppDefault
  • 使用默认服务和层 provide
  • 处理退出代码、参数和顶层错误
  • 派生纤程以及处理不安全边界

您已完成 ZIO 基础课程。

免费开始

用 AI 导师学习 Scala — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
143

常见问题解答

「运行 ZIO 应用」课时是免费的吗?

是的 — 「运行 ZIO 应用」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

「运行 ZIO 应用」这节课中我会学到什么?

ZIOAppDefault 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「运行 ZIO 应用」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ZIO 效果
  2. 组合 ZIO
  3. 错误通道与依赖通道
  4. 运行 ZIO 应用
← 返回 Scala for Backend Engineering & Functional Programming