gpt4 book ai didi

Scala ZIO Ref 数据类型

转载 作者:行者123 更新时间:2023-12-04 14:18:49 26 4
gpt4 key购买 nike

我在 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)
}

关于Scala ZIO Ref 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252919/

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