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 提供的模块的实现(包括 Console
,System
,Clock
,Random
,Scheduler
以及在 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。