Scala ZIO Ref 数据类型



我在 Scala 中有一个类,有四个参数 2 个是变量,我想在 Zio 中使用 Ref 数据类型来控制对这些变量的访问,这是我的代码:


import zio._
class Rectangle(val width: Int,val height: Int) {
  val x: UIO[Ref[Int]] = Ref.make(0)
  val y: UIO[Ref[Int]] = Ref.make(0)
  def this(x1: Int, y1: Int, width: Int, height: Int) {
    this(width, height)
    for {
      ref <- this.x
      _ <- ref.set(x1)
    } yield ()
    for {
      ref <- this.y
      _ <- ref.set(y1)
    } yield ()
  }
}

为了访问 Ref,我写了这个:

import zio.console._
import zio._
object AccessRef extends App {
  val myRec = new Rectangle(1, 2, 3, 4)
  override def run(args: List[String]) =
    for {
      rec <- IO.succeed(myRec)
      x <- rec.x
      x1 <- x.get
      _ <- putStrLn(x1.toString)
      _ <-putStrLn(rec.height.toString)
    } yield (0)
}

输出:

0
4

我想知道为什么 ref 的值不能更新为 1 而不是 0 ?

>val x: UIO[Ref[Int]] = Ref.make(0)不是参考。它是返回引用的操作的描述。

此代码

for {
      ref <- this.x
      _ <- ref.set(x1)
    } yield ()
创建一个引用,

为其设置一个值,然后立即丢弃该引用。很可能你想要xy属于Ref[Int]型。

例:

import zio.console._
import zio._
class Rectangle(val width: Ref[Int], val height: Ref[Int])
object AccessRef extends App {
  override def run(args: List[String]) =
    for {
      recW <- Ref.make(3)
      recH <- Ref.make(5)
      rectangle = new Rectangle(recW, recH)
      oldHeight <- rectangle.height.get
      _ <- putStrLn(s"old value: $oldHeight") //5
      _ <- rectangle.height.set(30)
      newHeight <- rectangle.height.get
      _ <- putStrLn(s"new value: $newHeight") //30
    } yield (0)
}

相关内容

  • 没有找到相关文章

最新更新