- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么 flatMap 中的 putStrLn 后跟结果语句没有有效地写入标准输出?
object Mgr extends App {
def main1(args: Array[String]) = getStrLn.flatMap { s =>
putStrLn(s) // Why this did not write to console?
UIO.succeed(s)
}
override def run(args: List[String]): URIO[zio.ZEnv, Int] = main1(Array()).fold(_ => 1,
{ x =>
println(x) // only this line wrote to console, why?
0
})
}
最佳答案
您的问题基本上是,您将两个效果放入单个 flatMap 中。
通过调用 putStrLn(s)
你实际上并没有打印到控制台,你只是在创建将在你的程序被解释和运行时打印的操作的描述(当方法 run
被调用)。并且因为在您的平面图中仅返回最后一个值(在您的情况下 UIO.succeed(s)
),因此在构建 ZIO 程序时只会考虑它。
您可以通过链接这两个操作来修复您的程序。
您可以使用 *>
运算符来完成:
def main1(args: Array[String]) = getStrLn.flatMap { s =>
putStrLn(s) *> UIO.succeed(s)
}
或者您可以将效果放入单独的平面 map 中。但是因为你想产生副作用(通过打印值),然后传递值不变,你需要使用特殊函数tap
:
def main1(args: Array[String]) = getStrLn.tap { s =>
putStrLn(s)
}.flatMap { s =>
UIO.succeed(s)
}
此 great article 中也描述了您的问题(以及其他陷阱) (看第一点)。
关于scala - 为什么zio的putStrLn没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038808/
这可能是一个愚蠢的问题,但从 ZIO 开始,我无法将 Seq[ZIO] 转换为 ZIO[Seq]: def translate(keys: Seq[String], locales: Seq[Loca
我创建了我的服务的两个版本。第一个使用 Futures,另一个使用 ZIO 作为效果。 我有一个使用 Future 作为结果效果的简单方法: def get(id: String)(implicit
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有一个返回一些 ZIO 的方法: def method(...): ZIO[Any with clock, SomeError, Unit] 调用此方法返回Task[Unit]: def other
(希望)关于 Scalaz Zio 的简单问题。 我有一些重构为 Zio 的旧代码。我希望该代码的一条路径保持原样: 同步 阻塞 在当前线程上(这是一个硬性要求) 我如何运行 IO这样它的行为就像旧的
我正在使用 ZIO:https://github.com/zio/zio 在我的 build.sbt : "dev.zio" %% "zio" % "1.0.0-RC9" 无论我尝试过什么,每次我需要
我想为 abort-early-in-a-fold 添加一个答案对于ZIO。 所以我采用了猫的解决方案:cats solution def sumEvenNumbers(nums: Stream[In
我有一堆 IO,所有这些都可能成功或失败: val result: Seq[IO[MyFailure, MySuccess]] = ... 我需要总结结果,以便我可以一起检查所有失败和所有成功: ca
我在 Scala 中有一个类有四个参数,其中 2 个是变量,我想在 Zio 中使用 Ref 数据类型来控制对这些变量的访问,这是我的代码: import zio._ class Rectangle(v
我找不到有关如何使用 ZIO 测试忽略套件或测试的任何信息。 无论是在示例中还是在文档中( https://zio.dev/docs/usecases/usecases_testing ) 有一个ig
我知道ZIO是维护自己的堆栈,即zio.internal.FiberContext#stack ,它保护递归函数,如 def getNameFromUser(askForName: UIO[Strin
我想按顺序运行两个集成测试。如何在 ZIO Test 中实现这一点? 这是套房: suite("Undeploy a Package")( testM("There is a Package"
scala.js 是否与 scala ZIO 一起使用? 我想在 scala.js 中使用 scala ZIO 我只知道如何在普通应用程序中使用 scala ZIO 有谁知道如何在 scala.js
我有几个 Booleans我想测试,比如 assert(g8Exists, equalTo(true)) && assert(projectExists, equalTo(true)) && asse
我想在 ZIO Fibers 上使用组合器 orElse。 从文档: 如果第一个纤维成功,则合成的纤维将成功,其结果;否则,组成的光纤将以第二条光纤的退出值完成(无论成功或失败)。 import zi
我有以下 ZIO 程序,其中包含两个永久运行的进程: for { .. numberProvider <- numberProvider(queue).fork //
我试过了 assert(anOption)(contains("x")) 但这仅适用于 Iterables,例如 List 或 Seq。 最佳答案 assert(anOption)(isSome(eq
我有以下功能,我想测试: def people(id: Int): RIO[R, People] 如果有一个人,此函数将返回 id , 分别如果没有,则失败,例如: IO.fail(ServiceEx
我有一个严重的副作用函数(想想数据库调用),我想将其用作惰性值,这样它只会在第一次使用时被调用(如果从未使用过则根本不会被调用)。 我如何使用 ZIO 做到这一点? 如果我的程序看起来像这样,函数只被
我是一名优秀的程序员,十分优秀!