我在Scala中有一个带有四个参数的类,其中两个是变量,我想在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?
答案 0 :(得分:3)
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)
}