gpt4 book ai didi

scala - MVar tryPut 返回 true 并且 isEmpty 也返回 true

转载 作者:行者123 更新时间:2023-12-02 07:59:19 27 4
gpt4 key购买 nike

我编写了简单的回调(处理程序)函数,我将其传递给异步 api,我想等待结果:

object Handlers {

val logger: Logger = Logger("Handlers")
implicit val cs: ContextShift[IO] =
IO.contextShift(ExecutionContext.Implicits.global)

class DefaultHandler[A] {

val response: IO[MVar[IO, A]] = MVar.empty[IO, A]

def onResult(obj: Any): Unit = {
obj match {
case obj: A =>
println(response.flatMap(_.tryPut(obj)).unsafeRunSync())
println(response.flatMap(_.isEmpty).unsafeRunSync())
case _ => logger.error("Wrong expected type")
}
}

def getResponse: A = {
response.flatMap(_.take).unsafeRunSync()
}
}

但出于某种原因,tryPut 和 isEmpty(当我手动调用 onResult 方法时)都返回 true,因此当我调用 getResponse 时它会永远休眠。这是我的测试:

class HandlersTest extends FunSuite {
test("DefaultHandler.test") {
val handler = new DefaultHandler[Int]
handler.onResult(3)
val response = handler.getResponse
assert(response != 0)
}
}

有人可以解释为什么 tryPut 返回 true,但没有 puts。在 scala 中使用 Mvar/channels 的正确方法是什么?

最佳答案

IO[X] 表示您拥有创建一些X 的方法。因此,在您的示例中,您正在输入一个 MVar,然后再询问另一个。

这是我的做法。

object Handlers {
trait DefaultHandler[A] {
def onResult(obj: Any): IO[Unit]

def getResponse: IO[A]
}

object DefaultHandler {
def apply[A : ClassTag]: IO[DefaultHandler[A]] =
MVar.empty[IO, A].map { response =>
new DefaultHandler[A] {
override def onResult(obj: Any): IO[Unit] = obj match {
case obj: A =>
for {
r1 <- response.tryPut(obj)
_ <- IO(println(r1))
r2 <- response.isEmpty
_ <- IO(println(r2))
} yield ()

case _ =>
IO(logger.error("Wrong expected type"))
}

override def getResponse: IO[A] =
response.take
}
}
}
}

关于scala - MVar tryPut 返回 true 并且 isEmpty 也返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com