我在 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 ()
创建一个引用,为其设置一个值,然后立即丢弃该引用。很可能你想要x
,y
属于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)
}