我有一个简单的理解代码:
def nameFormatter(request: SomeRequest) : FormattedData = {
for {
config <- ZIO.fromOption(configuration.get(request.name)).orElseFail( new Exception("Unknown config"))
name = config.data.name.pipe(SomeName)
} yield FormattedData(
name,
request.age
)
}
Run Code Online (Sandbox Code Playgroud)
但这个方法返回:
ZIO[Any, Exception, FormattedData]
Run Code Online (Sandbox Code Playgroud)
我想更改此方法以仅返回FormattedData,而不是整个 ZIO。是否可以?或者也许我应该以某种方式读取返回的类型并从中获取值?
ZIO 使执行此操作变得困难,因为它不安全并且违背了使用 ZIO 的目的。您可以从类型中看出,如果您尝试具体化该值,ZIO[Any, Exception, FormattedData]它可能会失败。Exception
如果你真的想这样做:
zio.Runtime.default.unsafeRun(nameFormatter(request))
Run Code Online (Sandbox Code Playgroud)
否则,您应该使用以下结果编写其余代码nameFormatter(request),并使用以下内容运行它:
import zio.{ExitCode, URIO, ZIO}
object Main extends zio.App {
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] =
(for {
formattedData <- nameFormatter(request)
// rest of your code
} yield ()).exitCode
}
Run Code Online (Sandbox Code Playgroud)